KMP算法模板
1 #define bug(x) cout<<#x<<" is "<<x<<endl 2 #include <bits/stdc++.h> 3 using namespace std; 4 const int N=1e3+10; 5 int n,m; 6 char p[1005]={"*abaabc"},T[1005]; 7 int f[1005],h[1005]; 8 void get_next(int next[]){ 9 int i=1,j=0; 10 while(i<n){ 11 if(j==0||p[i]==p[j]){ 12 i++,j++; 13 next[i]=j; 14 } 15 else{ 16 j=next[j]; 17 } 18 } 19 for(int z=1;z<=n;z++){ 20 printf("%d ",next[z]); 21 } 22 } 23 void GetNextval(char* p, int next[]) 24 { 25 next[1] = 0; 26 int j = 0; 27 int i = 1; 28 while (i < n) 29 { 30 if (j == 0 || p[j] == p[i]) 31 { 32 33 ++j; 34 ++i; 35 if (p[j] != p[i]) 36 { 37 //printf("*i=%d j=%d \n",i,j); 38 next[i] = j; 39 } 40 else { 41 //printf("i=%d j=%d \n",i,j); 42 next[i] = next[j]; 43 } 44 } 45 else 46 { 47 j = next[j]; 48 } 49 } 50 for(int z=1;z<=n;z++){ 51 printf("%d ",next[z]); 52 } 53 } 54 int main(){ 55 n=strlen(p+1); 56 for(int i=1;i<=12;i++){ 57 printf("%c ",p[i]); 58 } 59 printf("\n"); 60 get_next(h); 61 printf("\n"); 62 GetNextval(p,f); 63 } 64 /* 65 ababaaababaa 66 67 */