ACM入门之KMP
Posted 辉小歌
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ACM入门之KMP相关的知识,希望对你有一定的参考价值。
KMP可以O(n)的时间查找出一个字符串在另一个字符串出现的次数和位置。
KMP 的精髓在于,对于每次失配之后,我都不会从头重新开始枚举,而是根据我已经得知的数据,从某个特定的位置开始匹配;而对于模式串的每一位,都有唯一的“特定变化位置”,这个在失配之后的特定变化位置可以帮助我们利用已有的数据不用从头匹配,从而节约时间。
模板:
const int N=1e6+10;
char a[N],b[N];//让其下标从1开始
int n,m,ne[N];//ne[i]表示前i个字符的最长的相等的前后缀
void init()
cin>>n>>a+1>>m>>b+1;
for(int i=2,j=0;i<=n;i++)
while(j&&a[i]!=a[j+1]) j=ne[j];
if(a[i]==a[j+1]) j++;
ne[i]=j;
for(int i=1,j=0;i<=m;i++)
while(j&&b[i]!=a[j+1]) j=ne[j];
if(b[i]==a[j+1]) j++;
if(j==n)//求a在b出现的所有的位置
cout<<i-n<<" ";//下标从0开始
j=ne[j];
KMP的扩展应用:在一个字符串中找出最小周期,但这个周期在开头和结尾不一定是完整的n-ne[n] 就是最小的循环节长度
入门习题:
831. KMP字符串
P3375 【模板】KMP字符串匹配
P4391 [BOI2009]Radio Transmission 无线传输
以上是关于ACM入门之KMP的主要内容,如果未能解决你的问题,请参考以下文章