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的主要内容,如果未能解决你的问题,请参考以下文章

KMP之计算Next数组

数据结构串---KMP模式匹配算法之获取next数组

POJ1961[KMP 失配函数]

[算法入门]KMP算法

POJ2406Power Strings[KMP 失配函数]

HDU--1358--KMP算法失配函数getfail()的理解--Period