扩展kmp模板
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<set> #include<vector> #include<queue> #include<map> #include<algorithm> #include<cmath> #include<stdlib.h> #include<time.h> using namespace std; #define mmax 100000+10 void extendkmp(char *a,char *b,int m,int n,int *next,int *ret){ int i,j,k; memset(next,0,sizeof(next)); for(j=0;1+j<m&&a[j]==a[1+j];j++); next[1]=j; k=1; for(i=2;i<m;i++){ int len=k+next[k],l=next[i-k]; if(l<len-i){ next[i]=l; } else{ for(j=max(0,len-i);i+j<m&&a[j]==a[i+j];j++); next[i]=j; k=i; } } for(j=0;j<n&&j<m&&a[j]==b[j];j++); ret[0]=j; k=0; for(i=1;i<n;i++){ int len=k+ret[k],l=next[i-k]; if(l<len-i){ next[i]=l; } else{ for(j=max(0,len-i);j<m&&i+j<n&&a[j]==b[i+j];j++); ret[i]=j; k=i; } } } int main(){ char p[mmax],q[mmax]; int next[mmax],ret[mmax]; while(cin>>p>>q){ extendkmp(p,q,strlen(p),strlen(q),next,ret); for(int i=0;i<strlen(q);i++) cout<<ret[i]<<" "; cout<<endl; } }