本KMP算法模板借鉴自刘汝佳的白书模板,可自行取用
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 using namespace std; 5 int n,m; 6 char p[1000005],T[1000005]; 7 int f[1000005]; 8 void getfail(char *p,int *f){ 9 int m=strlen(p); 10 f[0]=f[1]=0; 11 for(int i=1;i<m;i++){ 12 int j=f[i]; 13 while(j&&p[i]!=p[j])j=f[j]; 14 f[i+1]=p[i]==p[j]?j+1:0; 15 } 16 } 17 void find(char *T,char *p,int *f){ 18 n=strlen(T),m=strlen(p); 19 getfail(p,f); 20 int j=0; 21 for(int i=0;i<n;i++){ 22 while(j&&p[j]!=T[i])j=f[j]; //顺着失配边走,直到可以匹配 23 if(p[j]==T[i])j++; 24 if(j==m){ 25 printf("%d\n",i-m+2); //输出匹配成功后的第一个字符的位置 26 } 27 } 28 } 29 int main(){ 30 scanf("%s",T); 31 scanf("%s",p); 32 find(T,p,f); 33 for(int i=1;i<=m;i++){ 34 printf("%d ",f[i]); 35 } 36 }