【模板】KMP字符串匹配
模板题(不过这题是完全版,用简化版的建议嫖部分tj)
1 #include <cstdio> 2 #include <iostream> 3 #include <algorithm> 4 #include <cstring> 5 using namespace std; 6 7 int n,m; 8 int next[1000005]; 9 char a[1000005],b[1000005]; 10 11 int kmp() 12 { 13 int j=0; 14 15 for(int i=1;i<=n;i++) 16 { 17 18 while(j&&b[j+1]!=a[i]) 19 j=next[j]; 20 21 if(b[j+1]==a[i]) 22 j++; 23 24 if (j==m) 25 { 26 printf("%d\n",i-m+1); 27 j=next[j]; 28 } 29 30 } 31 32 return 0; 33 } 34 35 int ycl() 36 { 37 int j=0; 38 39 for (int i=2;i<=m;i++) 40 { 41 42 while(j&&b[i]!=b[j+1]) 43 j=next[j]; 44 45 if(b[j+1]==b[i]) 46 j++; 47 48 next[i]=j; 49 } 50 51 return 0; 52 } 53 54 int main() 55 { 56 57 scanf("%s%s",a+1,b+1); 58 n=strlen(a+1); 59 m=strlen(b+1); 60 61 ycl(); 62 kmp(); 63 64 for(int i=1;i<=m;i++) 65 printf("%d ",next[i]); 66 67 return 0; 68 } 69