P3426-[POI2005]SZA-Template【KMP】
正题
题目链接:https://www.luogu.com.cn/problem/P3426
题目大意
给出一个长度为\(n\)的字符串\(s\),求一个长度最小的字符串\(t\)使得\(s\)所有\(t\)和\(t\)匹配的位置能覆盖串\(s\)。
\(1\leq n\leq 5\times 10^5\)
解题思路
首先答案肯定是原串的一个\(border\),设\(f_i\)表示前缀\(s_{1\sim i}\)的答案。
考虑如何转移,首先\(f_i\)至多是\(i\),然后考虑如果有一个串\(t\)能够覆盖\(s_{1\sim nxt_i}\)那么才有可能能覆盖\(s_{1\sim i}\)。(因为如果覆盖大于\(nxt_i\)显然不可能覆盖整个串,不然就至少需要覆盖到\(s_{1\sim nxt_i}\))。
考虑什么时候\(f_i\)能够取到\(f_{nxt_i}\)。首先我们可以表示出\(s_{1,nxt_i}\)假设我们上次覆盖的位置是\(j\in[nxt_i,i]\),那么需要有\(f_{j}=f_{nxt_i}\)(即取到同一个\(border\)),然后要求\(j\geq i-nxt_i\)(这样就可以用\(s_{1,nxt_i}\)覆盖剩下的)。
时间复杂度\(O(n)\)
code
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=5e5+10;
int n,f[N],nxt[N],ls[N];
char s[N];
int main()
{
scanf("%s",s+1);n=strlen(s+1);
for(int i=2,j=0;i<=n;i++){
while(j&&s[j+1]!=s[i])j=nxt[j];
j+=(s[i]==s[j+1]);nxt[i]=j;
}
for(int i=1;i<=n;i++){
f[i]=i;
if(i-ls[f[nxt[i]]]<=nxt[i])
f[i]=f[nxt[i]];
ls[f[i]]=i;
}
printf("%d\n",f[n]);
return 0;
}
P3426-[POI2005]SZA-Template【KMP】的更多相关文章
- 【KMP】【最小表示法】NCPC 2014 H clock pictures
题目链接: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1794 题目大意: 两个无刻度的钟面,每个上面有N根针(N<=200000),每个 ...
- 【动态规划】【KMP】HDU 5763 Another Meaning
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5763 题目大意: T组数据,给两个字符串s1,s2(len<=100000),s2可以被解读成 ...
- HDOJ 2203 亲和串 【KMP】
HDOJ 2203 亲和串 [KMP] Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- 【KMP】Censoring
[KMP]Censoring 题目描述 Farmer John has purchased a subscription to Good Hooveskeeping magazine for his ...
- 【KMP】OKR-Periods of Words
[KMP]OKR-Periods of Words 题目描述 串是有限个小写字符的序列,特别的,一个空序列也可以是一个串.一个串P是串A的前缀,当且仅当存在串B,使得A=PB.如果P≠A并且P不是一个 ...
- 【KMP】Radio Transmission
问题 L: [KMP]Radio Transmission 题目描述 给你一个字符串,它是由某个字符串不断自我连接形成的.但是这个字符串是不确定的,现在只想知道它的最短长度是多少. 输入 第一行给出字 ...
- 【kmp】似乎在梦中见过的样子
参考博客: BZOJ 3620: 似乎在梦中见过的样子 [KMP]似乎在梦中见过的样子 题目描述 「Madoka,不要相信QB!」伴随着Homura的失望地喊叫,Madoka与QB签订了契约. 这是M ...
- 【POJ2752】【KMP】Seek the Name, Seek the Fame
Description The little cat is so famous, that many couples tramp over hill and dale to Byteland, and ...
- 【POJ2406】【KMP】Power Strings
Description Given two strings a and b we define a*b to be their concatenation. For example, if a = & ...
- 【POJ3461】【KMP】Oulipo
Description The French author Georges Perec (1936–1982) once wrote a book, La disparition, without t ...
随机推荐
- linux 常用的更新命令
apt update apt install g++ apt install build_essential
- Linux下的Shell工作原理
Linux下的Shell工作原理 Linux系统提供给用户的最重要的系统程序是Shell命令语言解释程序.它不属于内核部分,而是在核心之外,以用户态方式运行.其基本功能是解释并执行用户打入的各种命令, ...
- java输入字符
1.创建一个Scanner对象. 2.调用.next()返回一个String类型用一个变量接受. 3.调用该String变量的.charAt(0),获取第一个字符. Scanner scn=new S ...
- Go进阶--httptest
目录 基本使用 扩展使用 接口context使用 模拟调用 测试覆盖率 参考 单元测试的原则,就是你所测试的函数方法,不要受到所依赖环境的影响,比如网络访问等,因为有时候我们运行单元测试的时候,并没有 ...
- for循环操作(for...in、forEach)
1.for...in语句用于对数组或者对象的属性进行循环操作,是for循环的一种. 注意:该方法可用于数组或对象. 语法: for(变量 in 对象/数组){} 如: var obj = { nam ...
- C# - 习题06_从键盘输入半径r,求出圆的面积
时间:2017-08-24 整理:byzqy 题目:编写一个程序,定义常量 Pi = 3.14159265 , 从键盘上输入半径 r ,求出圆的面积. 代码如下: 1 using System; 2 ...
- Docker容器管理——进入容器命令
一.docker exec 命令(这个命令的本质就是让docker exec替我在容器执行一条命令,当执行的命令是/bin/bash的时候就是执行一条登陆命令,则会进入容器内部) 1.让docker ...
- NOI2021 游记
day -10 开始一天一场NoIP模拟赛,前几场每天挂分很厉害(这么说是因为后面的以前做过) 自省选惨挂以后国赛的知识点就几乎没怎么摸过了,考前发现连manacher都不会写了,反演?又陷入&quo ...
- IPv4掩码与掩码位数的转换
1. 根据掩码获取掩码的位数 int mask2len(unsigned int mask) { /*eg: 255.255.255.0 255.0.255.255.0*/ int bit=0,len ...
- mysql远程连接以及错误解决&命令行基本操作
现在大家的程序服务基本都是部署在云服务器上,今天我分享记录一下:使用mysql数据库过程中比较常见操作和遇到的问题 环境:lunix 系统(阿里云服务器,华为云服务器,腾讯云等均适用) + mysql ...