2023牛客五一集训派对day1部分题解

news2024/10/6 14:27:41

F Infinite String Comparision

FInfinite String Comparision

题目描述

给你两个可以无限复制自身的字符串 a, b。请你判断其无限复制后两字符串的字典序大小 。

解题思路

我们可以设 s1 = a + b, s2 = b + a

则有:

s1^{\infty }=ababab...

s2^{\infty}=bababa...

通过观察可见 s1, s2 包含 a^{\infty} 和 b^{\infty},于是我们比较 s1, s2 相当于比较 s1^{\infty} 和 s2^{\infty}

此时可以把 a 和 b 都看作一位数(类似于十进制), 那么我们可以把字典序的比较看作每一位上的比较, 也就是说此时比较的就是各位的数(a, b)乘上对应位的权值

之后我们再设:

s1^{\infty} 中 a^{\infty} 对应的权值总和为 sum1, b^{\infty} 对应的权值总和为 sum2

s2^{\infty} 中 a^{\infty} 对应的权值总和为 sum2, b^{\infty} 对应的权值总和为 sum1

具体解释一下:

sum1 对应 2k - 1 位 k = 1, 2, 3...

sum2 对应 2k 位 k = 1, 2, 3...

按 x 进制表示则有位数越小, 位数就越考前, 权值也就越大

s1 - s2 = s1^{\infty} - s2^{\infty} = (sum1 * a^{\infty} + sum2 * b^{\infty}) -  (sum2 * a^{\infty} + sum1 * b^{\infty})

s1 - s2 = (sum1 - sum2) * (a^{\infty} - b^{\infty})

则有 sum1 - sum2 > 0

则 s1 - s2 可以表示 a^{\infty} - b^{\infty} 的字典序, 故直接比较 s1 - s2  即可

代码示例

#include<bits/stdc++.h>
using namespace std;

string a, b;

int main(){
    while(cin >> a >> b){
        string sa = a + b;
        string sb = b + a;
        if(sa < sb) cout << "<\n";
        if(sa > sb) cout << ">\n";
        if(sa == sb) cout << "=\n";
    }
}

J Easy Integration

JEasy Integration

题目描述

求 \int_{0}^{1}(x - x^{2})^{n}dx在取 mod = 998244353 之后的结果

解题思路

分部积分推导过程

\int_{0}^{1}(x - x^{2})^{n}dx=(n!)^{2}/(2 * n + 1)!

这里提前预处理一下阶乘, 注意取逆元就可以了

代码示例

#include<bits/stdc++.h>
using namespace std;

#define int long long

const int N = 2e6 + 10;
const int mod = 998244353;
int n;
int a[N];

int q_pow(int a, int b, int mod){
    int cnt = 1;
    while(b){
        if(b & 1) cnt = cnt * a % mod;
        a = a * a % mod;
        b >>= 1;
    }
    return cnt;
}

int fermat(int a, int mod){
    return q_pow(a, mod - 2, mod);
}

signed main(){
    a[1] = 1;
    for(int i = 2; i <= 2e6 + 1; i++){
        a[i] = a[i - 1] * i;
        a[i] %= mod;
    }  
    while(cin >> n){
        int up = q_pow(a[n], 2, mod);
        int down = a[2 * n + 1];
        cout << up * fermat(down, mod) % mod << '\n';
    }
}

A B-Suffix Array

AB-Suffix Array

题目大意

给出一个只含有 ' a ' 和 ' b ' 的字符串,再给出 B 数组的构造方法如下:对于每个位置 i 来说

  • 如果存在一个位置 j ,使得 j < i 且 s[ j ] == s[ i ] ,则 b[ i ] = min(i - j)
  • 否则 b[ i ] = 0

现在需要对字符串的每个后缀构造 B 数组,并按照字典序排序

解题思路

首先我们要了解一下后缀数组, 如果您已知晓可以直接跳到分析部分

后缀数组

一句话概括: 一个字符串的所有后缀按字典序排序后的结果, 就是这一个字符串的后缀数组

  • str: 需要处理的字符串(长度为len)
  • suffix[i]: str下标为 i ~ len 的连续子串(即后缀)
  • rank[i]: suffix[i]在所有后缀中的排名
  • sa[i]: 表示将所有后缀排序后第 i 小的后缀的编号, 也是所说的后缀数组, 满足 suffix[sa[1]] < suffix[sa[2]] …… < suffix[sa[len]], 即排名为 i 的后缀为 suffix[sa[i]] 
  • 满足一个特殊性质 rank[sa[i]] = sa[rank[i]] = i

这就是Rank和SA

用倍增方法求后缀数组 O(Nlog^{2}N)

对于一个后缀 suffix[i], 如果想直接得到 rank 比较困难,但是我们可以对每个字符开始的长度为 2^{k}的字符串求出排名,k 从 0 开始每次递增 1 (每递增 1 就成为一轮),当 2^{k} 大于 len 时, 所得到的序列就是 rank, 此时 sa 也可以间接计算出来

首先对字符串 str 的所有长度为 1 的子串, 即每个字符进行排序, 得到排序后的编号数组 sa_{1} 和排名数组 rank_{1}

 简单概括一下: 对于长度为 len 的字符串 str, 第 k 轮 substr(i, 2^{k}) 可以看成 substr(i, 2^{k - 1}) 和 substr(i + 2^{k - 1}, 2^{k}) 的拼接, 而这两个 substr 是我们之前计算过的, 于是就可以看成两个关键字进行比较, 再把此轮的每个位置的双关键字进行比较重新排名就是这一轮的 rank

就像一个两位数的比较

构造最长公共前缀 - height

  • heigth[i]: 表示 suffix[sa[i]] 和 suffix[sa[i - 1]] 的最长公共前缀, 也就是排名相邻的两个后缀的最长公共前缀
  • h[i]: 等于 height[rank[i]], 也就是后缀 suffix[i] 和它前一名的后缀的最长公共前缀
  • 而两个排名不相邻的最长公共前缀定义为排名在它们之间的 height 的最小值

这就是Height

设 suffix[k] 是排在 suffix[i - 1] 前一名的后缀, 则它们的最长公共前缀是 h[i - 1], 都去掉第一个字符, 就变成 suffix[k + 1] 和 suffix[i], 如果 h[i - 1] = 0 或 1, 那么 h[i] ≥ 0 显然成立, 否则 h[i] ≥ h[i - 1] - 1(去掉了原来的第一个, 其他前缀一样相等), 所以 suffix[i] 和在它前一名的后缀的最长公共前缀至少是 h[i - 1] - 1 进而可以求出来 height[i]

参考资料:

OI Wiki 后缀数组

五分钟搞懂后缀数组!后缀数组解析以及应用(附详解代码)

分析部分

这里官方题解用了一个很巧妙的结论

代码示例

持续更新中~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/477117.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

01 KVM虚拟化简介

文章目录 01 KVM虚拟化简介1.1 简介1.2 虚拟化架构1.3 虚拟化组件1.4 虚拟化特点1.5 虚拟化优势1.6 openEuler虚拟化 01 KVM虚拟化简介 1.1 简介 在计算机技术中&#xff0c;虚拟化是一种资源管理技术&#xff0c;它将计算机的各种实体资源&#xff08;处理器、内存、磁盘、网…

基于simulink采用 QSHB 和 HBPS 算法的混合 MIMO 波束成形仿真

一、前言 本例展示了多输入多输出 &#xff08;MIMO&#xff09; 无线通信系统的 Simulink 模型。无线系统使用混合波束成形技术来提高系统吞吐量。 二、介绍 5G和其他现代无线通信系统广泛使用MIMO波束成形技术进行信噪比&#xff08;SNR&#xff09;增强和空间复用&#xff0…

数据恢复软件EasyRecovery16下载安装步骤教程

EasyRecovery16是一款专业好用的数据恢复软件&#xff0c;软件提供了向导式的操作向导&#xff0c;可以有效地恢复电脑或者移动存储设备中丢失的各种文件&#xff0c;包括删除的文件、格式化丢失的文件和清空回收站的数据!千呼万唤始出来&#xff0c;大家期盼许久的EasyRecover…

阿里云u1服务器通用算力型CPU处理器性能测评

阿里云服务器u1通用算力型Universal实例高性价比&#xff0c;CPU采用Intel(R) Xeon(R) Platinum&#xff0c;主频是2.5 GHz&#xff0c;云服务器U1实例的基准vCPU算力与5代企业级实例持平&#xff0c;最高vCPU算力与6代企业级实例持平&#xff0c;提供2c-32c规格和1:1/2/4/8丰富…

16.基于主从博弈理论的共享储能与综合能源微网优化运行研究

说明书 MATLAB代码&#xff1a;基于主从博弈理论的共享储能与综合能源微网优化运行研究 关键词&#xff1a;主从博弈 共享储能 综合能源微网 优化调度 参考文档&#xff1a;《基于主从博弈理论的共享储能与综合能源微网优化运行研究》完全复现 仿真平台&#xff1a;MATLAB …

前端面试题汇总-代码输出篇

1. 异步 & 事件循环 1. 代码输出结果 const promise new Promise((resolve, reject) > {console.log(1);console.log(2); }); promise.then(() > {console.log(3); }); console.log(4); 输出结果如下&#xff1a; 1 2 4 promise.then 是微任务&#xff0c;它…

力扣刷题实录(大厂用题)—— 前言

写在前面 力扣刷题笔记与力扣官方的解答有什么区别吗&#xff1f;为什么不直接去看官方的解答呢 &#xff1f;并且官方的解答部分还有视频讲解。 这个问题困扰了我很长时间&#xff0c;我不断地怀疑自己做笔记是否有意义。 后来有一个小伙伴问我问题的时候我悟了&#xff0c…

【Linux 裸机篇(八)】I.MX6U EPIT 定时器中断、定时器按键消抖

目录 一、EPIT 定时器简介二、定时器按键消抖 一、EPIT 定时器简介 EPIT 的全称是&#xff1a; Enhanced Periodic Interrupt Timer&#xff0c;直译过来就是增强的周期中断定时器&#xff0c;它主要是完成周期性中断定时的。学过 STM32 的话应该知道&#xff0c; STM32 里面的…

windows卸载wsl下的ubuntu

查看&#xff1a; wsl --list删除&#xff1a; wsl --unregister Ubuntu-18.04 注意名字别输入错误了&#xff0c;版本号是你wsl安装的对应的ubuntu版本号。 查看&#xff1a; wsl --list

提速科研,AI 正引领一场新革命

By 超神经 内容一览&#xff1a;五一国际劳动节假期&#xff0c;HyperAI超神经为大家汇总了往期 ScienceAI 相关报道&#xff0c;对该领域感兴趣的读者可以来一探究竟了&#xff01; 关键词&#xff1a;ScienceAI 盘点 整理 | 缓缓 作为近两年的技术热点&#xff0c;Scien…

Sybase使用sp_helptext查看系统存储过程的源码

sp_helptext存储过程用于显示已编译对象的源代码。 sp_helptext是Sybase ASE内置的存储过程&#xff0c;可从任何位置调用。 但实际上&#xff0c;如果直接使用&#xff0c;常常会得到&#xff08;令人头大的&#xff09;错误提示&#xff1a; Msg 17461 Object does not exi…

JavaWeb学习------Servlet

目录 JavaWeb学习------Servlet Servlet 生命周期 Servlet 生命周期 Servlet 方法介绍 •Servlet 体系结构 Servlet 体系结构 •Servlet urlPattern配置 Servlet urlPattern配置 •XML 配置方式编写 Servlet XML 配置方式编写 Servlet JavaWeb学习------Servlet •快速…

centos安装 磁盘分区选择

1 介绍 INSTALLATION SUMMARY 在硬盘进行分区后&#xff0c;我们一般都会进行格式化&#xff0c;因为每种操作系统对文件属性/权限/存储数据格式的设定都有所不同&#xff0c;故而为了使得其跟操作系统一致&#xff0c;则需要格式化。 哈喽&#xff0c;大家好&#xff0c;我是…

Java AQS学习

目录 1、AQS初步 2、AQS源码 2.1、ReentrantLock类解析 2.2、AQS源码 JUC-->AQS-->AbstractQueuedSynchronizer&#xff1a;字面意思&#xff1a;抽象的队列同步器 AQS是用来构建锁或者其它同步器组件的重量级基础框架及整个JUC体系的基石&#xff0c;通过内置的FIFO…

InnoDB 引擎 底层逻辑

目录 0 课程视频 1 逻辑存储结构 1.1 结构图 1.2 表空间 -> 记录 索引 存储记录 等数据 1.2.1 储存在 cd/var/lib/mysql -> ll -> 目录 mysql.ibd 1.3 段 -> 索引 存储记录 具体存储 1.3.1 数据段 b树 叶子节点 1.3.2 索引段 b树的 非叶子节点 1.3.3 回滚段…

Java 基础入门篇(一)——— Java 概述

文章目录 一、Java 概述二、Java 的产品 JDK2.1 JDK 安装2.2 Java与 Javac 介绍2.3 Java 程序的开发步骤 三、Java 程序的执行原理四、JDK 的组成五、Java 的跨平台工作原理 一、Java 概述 Java 是 sun 公司在 1995 年推出的一门计算机高级编程语言&#xff0c;其语言风格接近人…

javaEE+mysql学生竞赛管理系统

本系统是基于JAVA平台开发的一套学生竞赛信息管理的系统。系统采用JSP为编程语言。数据库采用Mysql建立数据之间的转换。论文主要介绍了本课题的开发背景&#xff0c;所要完成的功能和开发的过程。重点的说明了系统设计的重点、设计思想、难点技术和解决方案。 本课题的目的是使…

none模式配置网络操作

基于Docker引擎启动Nginx WEB容器&#xff0c;默认以None方式启动Docker容器&#xff0c;此处使用pipework工具手工给容器指定桥接网卡&#xff0c;并且手工配置IP地址&#xff0c;操作指令如下&#xff1a; #查看镜像列表&#xff1b; docker images#运行新的容器 docker ru…

【Python】【进阶篇】17、如何配置settings.py文件

目录 17、如何配置settings.py文件1) 修改语言与时区配置2) 设置时区不敏感3) 配置项目所需数据库4&#xff09;学会阅读报错信息 17、如何配置settings.py文件 《settings.py配置文件详解》一文中&#xff0c;将 settings.py 配置文件的每一项给大家做了介绍。在开发的过程中…

MYSQL进阶02

MYSQL进阶02 数据类型char与varchartext与blob浮点数与定点数日期类型的选择 数据类型 char与varchar char和varchar类型类似&#xff0c;都用来存储字符串&#xff0c;但是他们保存和检索的方式不同。char属于固定长度的字符类型&#xff0c;而varchar属于可变长度的字符类型…