KMP模板

来源:互联网 发布:论文查重率软件 编辑:程序博客网 时间:2024/06/06 18:53

https://www.luogu.org/problem/lists?name=3375洛谷P3375KMP字符串匹配
这个算法真是精妙~

#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<cmath>using namespace std;int len1,len2,tot;int Next[100010],pos[100010];char s[1000010],t[100010];void initNext(){    int j=0;    for(int i=2;i<=len2;i++)    {        while(j&&t[i]!=t[j+1])        j=Next[j];        if(t[i]==t[j+1])        j++;        Next[i]=j;    }}/*void initNext()//从0开始存 {    int j=-1;    Next[0]=-1;    for(int i=1;i<len;i++)    {        while(j!=-1&&t[i]!=t[j+1])        j=Next[j];        if(t[i]==t[j+1])        j++;        Next[i]=j;    }}*/int KMP(){    int j=0,ans=0;    for(int i=1;i<=len1;i++)    {        while(j&&s[i]!=t[j+1])        j=Next[j];        if(s[i]==t[j+1])        j++;        if(j==len2)        {            //ans++;            pos[++tot]=i;            j=Next[j];        }    }    //return ans;}int main(){    scanf("%s%s",s+1,t+1);    len1=strlen(s+1);    len2=strlen(t+1);    initNext();    KMP();    for(int i=1;i<=tot;i++)    printf("%d\n",pos[i]-len2+1);    for(int i=1;i<=len2;i++)    printf("%d ",Next[i]);    return 0;}