正题

题目链接: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;
}

最新文章

  1. 查看Android应用的package name和activity name方面
  2. cocos2d-x 帧循环不严谨造成场景切换卡顿
  3. Qrels supervision information以及document collection,如何划分为train、test,保证test中doc对于train来说是new document
  4. linux下查看磁盘空间 [转]
  5. 【Search for a Range】cpp
  6. Linux 目录操作和4中文件拷贝效率测试
  7. Redis学习手册(持久化)
  8. HttpServletResponse HttpServletRequest RequestDispatcher
  9. Chrome设计文档-多进程资源加载
  10. 微服务框架下的思维变化-OSS.Core基础思路
  11. 【转载】MapReduce编程 Intellij Idea配置MapReduce编程环境
  12. JavaSE习题 第四章 类与对象
  13. AutoMapper之自定义解析
  14. Selenium+Java元素定位之三
  15. transition过度效果 + transform旋转360度
  16. curl命令实现上网认证登录
  17. 【Leetcode】86. Partition List
  18. spring事務
  19. 001PHP文件处理——文件处理disk_total_space disk_free_space basename dirname file_exists filetype
  20. [TC6194]AllWoundUp

热门文章

  1. rsync基本使用
  2. mongoose报错:DeprecationWarning: collection.ensureIndex is deprecated. Use createIndexes instead
  3. HTML &lt;form&gt; 标签的 method 属性
  4. vue2.0中文文档
  5. CrackMe-Cycle
  6. MVVM框架三巨头之Vue的前世今生。
  7. vscode 1.32.x按下鼠标左键无法拖曳选择,而旧一点的版本1.30.2可以
  8. Java反射的浅显理解
  9. jenkins AWS CodeDeploy不停机部署
  10. C#新版本风格(NetCore)项目文件