KMP模板

来源:互联网 发布:网络中介服务提供商 编辑:程序博客网 时间:2024/05/21 23:33
#include<cstdio>#include<cstring>using namespace std;char pat[1005],text[1000005];int lenp,lens;int next[1005],ans[1000005],pos;void cal_next(){next[1]=0;for(int i=2;i<=lenp;i++){int j=next[i-1];while(pat[j+1]!=pat[i]&&j) j=next[j];if(pat[j+1]==pat[i]) next[i]=j+1;else next[j]=0;}}void kmp(){int j=0;for(int i=1;i<=lens;i++){while(j&&text[i]!=pat[j+1]) j=next[j];if(text[i]==pat[j+1]) j++;if(j==lenp) ans[++pos]=i-lenp+1,j=next[j];}}int main(){freopen("kmp2.in","r",stdin);freopen("kmp2.out","w",stdout);scanf("%s%s",text+1,pat+1);lenp=strlen(pat+1);lens=strlen(text+1);cal_next();kmp();for(int i=1;i<=pos;i++) printf("%d\n",ans[i]);for(int i=1;i<=lenp;i++) printf("%d ",next[i]);return 0;} 

0 0