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 }
posted @ 2022-02-08 20:22  scannerkk  阅读(56)  评论(0)    收藏  举报