P3375KMP模板
代码实现
1 #include "bits/stdc++.h" 2 using namespace std; 3 const int maxn = 1e6; 4 char s1[maxn + 10],s2[maxn + 10]; 5 int nextval[maxn + 10]; 6 int ans[maxn + 10]; 7 int l = 0; 8 void Getnext(char *st) 9 { 10 nextval[0] = -1; 11 int len = strlen(st); 12 int j = 0,k = -1; 13 while(j < len){ 14 if(k == -1 || st[j] == st[k]) { 15 j++; 16 k++; 17 nextval[j] = k; 18 } 19 else 20 k = nextval[k]; 21 } 22 } 23 void Gkmp(char *st1,char *st2) 24 { 25 int len1 = strlen(st1); 26 int len2 = strlen(st2); 27 int j = 0; 28 int i = 0; 29 while(i < len1 && j < len2) { 30 if(j == -1 || st2[j] == st1[i]){ 31 i++,j++; 32 if(j == len2){ 33 cout << i - len2 + 1 << endl; 34 j = nextval[j];//这句是关键不然T三个 35 } 36 } 37 else 38 j = nextval[j]; 39 } 40 } 41 int main() 42 { 43 cin >> s1; 44 cin >> s2; 45 Getnext(s2); 46 Gkmp(s1,s2); 47 int len2 = strlen(s2); 48 for(int i = 1;i <= len2;i++) 49 cout << nextval[i] << ' '; 50 return 0; 51 }
本文来自博客园,作者:{scanner},转载请注明原文链接:{https://home.cnblogs.com/u/scannerkk/}

浙公网安备 33010602011771号