kmp字符串匹配算法模板


题目链接:https://www.luogu.com.cn/problem/P3375

ac代码:

 1 #include
 2 #include
 3 #include
 4 #include
 5 #include
 6 #include
 7 #include<set>
 8 #include
 9 #include
10 #include
11 #include<string>
12 #define ll long long
13 #define ull unsigned long long
14 #define inf 0x3f3f3f3f
15 #define inff 0x7fffffff
16 using namespace std;
17 const int N = 100000 + 10;
18 const int M = 1000000 + 10;
19 const ll mod = 1e9 + 7;
20 
21 char s[M], p[N];
22 int next_kmp[N];
23 
24 void kmp_pre(int m) {
25 
26     int i, j;
27     i = 0;
28     j = next_kmp[0] = -1;
29     while (i < m) {
30         while (j != -1 && p[i] != p[j]) j = next_kmp[j];
31         next_kmp[++i] = ++j;
32     }
33 
34     return;
35 }
36 
37 int ans = 0;
38 
39 void kmp(int n, int m) {
40     
41     //int ans = 0;
42     int i, j;
43     i = 0, j = 0;
44     kmp_pre(m);
45     while (i < n) {
46         while (j != -1 && s[i] != p[j]) j = next_kmp[j];
47         i++, j++;
48         if (j >= m) {
49             cout << i - m + 1 << "\n";
50             ans++;
51             j = next_kmp[j];
52         }
53     }
54 
55     return;
56     //return ans;
57 }
58 
59 
60 int main() {
61 
62     //int lenp, lens;
63     cin >> s;
64     cin >> p;
65     int lens = strlen(s);
66     int lenp = strlen(p);
67     kmp(lens, lenp);
68     //putchar('\n');
69     //cout << ans << "\n";
70     //cout << kmp(lens, lenp) << "\n";
71     for (int i = 1; i <= lenp; i++) {
72         cout << next_kmp[i] << " ";
73     }
74 
75     return 0;
76 }
 

相关