正题

题目链接: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】的更多相关文章

  1. 【KMP】【最小表示法】NCPC 2014 H clock pictures

    题目链接: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1794 题目大意: 两个无刻度的钟面,每个上面有N根针(N<=200000),每个 ...

  2. 【动态规划】【KMP】HDU 5763 Another Meaning

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5763 题目大意: T组数据,给两个字符串s1,s2(len<=100000),s2可以被解读成 ...

  3. HDOJ 2203 亲和串 【KMP】

    HDOJ 2203 亲和串 [KMP] Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...

  4. 【KMP】Censoring

    [KMP]Censoring 题目描述 Farmer John has purchased a subscription to Good Hooveskeeping magazine for his ...

  5. 【KMP】OKR-Periods of Words

    [KMP]OKR-Periods of Words 题目描述 串是有限个小写字符的序列,特别的,一个空序列也可以是一个串.一个串P是串A的前缀,当且仅当存在串B,使得A=PB.如果P≠A并且P不是一个 ...

  6. 【KMP】Radio Transmission

    问题 L: [KMP]Radio Transmission 题目描述 给你一个字符串,它是由某个字符串不断自我连接形成的.但是这个字符串是不确定的,现在只想知道它的最短长度是多少. 输入 第一行给出字 ...

  7. 【kmp】似乎在梦中见过的样子

    参考博客: BZOJ 3620: 似乎在梦中见过的样子 [KMP]似乎在梦中见过的样子 题目描述 「Madoka,不要相信QB!」伴随着Homura的失望地喊叫,Madoka与QB签订了契约. 这是M ...

  8. 【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 ...

  9. 【POJ2406】【KMP】Power Strings

    Description Given two strings a and b we define a*b to be their concatenation. For example, if a = & ...

  10. 【POJ3461】【KMP】Oulipo

    Description The French author Georges Perec (1936–1982) once wrote a book, La disparition, without t ...

随机推荐

  1. Docker开启TLS和CA认证

    前言:Docker直接开启2375端口是不安全的,别人只要连上之后就可以任意操作,下面是开启Docker的TLS和CA认证方法,并使用Jenkins和Portainer连接. 一.生成证书 查看服务器 ...

  2. 栈编程和函数控制流: 从 continuation 与 CPS 讲到 call/cc 与协程

    原标题:尾递归优化 快速排序优化 CPS 变换 call/cc setjmp/longjmp coroutine 协程 栈编程和控制流 讲解 本文为部分函数式编程的扩展及最近接触编程语言控制流的学习和 ...

  3. WPF教程(四)RelativeSource属性

    我们进行Bingding时,如果明确知道数据源的Name,就能用Source或者ElementName进行绑定,但是有时候我们需要绑定的数据源可能没有明确的Name,此时我们就需要利用Bingding ...

  4. C++ 计算MD5

    头文件: #pragma once #ifndef MD5_H #define MD5_H #include <string> #include <fstream> /* Ty ...

  5. SpringMVC之@ControllerAdvice

    @ControllerAdvice ,很多初学者可能都没有听说过这个注解,实际上,这是一个非常有用的注解,顾名思义,这是一个增强的 Controller.使用这个 Controller ,可以实现三个 ...

  6. onJava8学习--java集合

    翻翻博客,写了挺多,也学习过这些知识,翻翻脑子,没找到,再来一遍,整理好方便查阅复习. 本次学习内容来自On Java8java编程思想第五版 ​​​​​​ 集合 泛型和类型安全的集合 基本概念 添加 ...

  7. 安装完anaconda之后找不到启动图标

    安装anaconda的过程中,选择了only me模式,安装完之后找不到启动图标,安装网上的方法: 在命令行输入 conda update menuinstconda install -f conso ...

  8. Vulnhub靶机渗透 -- DC5

    信息收集 通过nmap搜索到IP为:192.168.200.11 开启了80http.111RPC服务端口 先打开网页,然后进行目录爆破 contact.php 攻击 经搜索没有发现可以攻击wheel ...

  9. Android Jetpack基本架构之ViewModel+LiveData+DataBinding入门

    前提:导入所有依赖,开启DataBinding app的build.gradle android { defaultConfig { ... dataBinding { enabled true } ...

  10. java交互Scanner类

    用next方法接收 import java.util.Scanner; public class Demo01 { public static void main(String[] args) { / ...