基础数据结构:KMP

发布时间 2023-10-29 10:36:28作者: karinto

1、KMP

以AcWing.831为例,

给定一个模式串S,以及一个模板串P,所有字符串中只包含大小写英文字母以及阿拉伯数字。

模板串P在模式串S中多次作为子串出现。

求出模板串P在模式串S中所有出现的位置的起始下标。

输入格式
第一行输入整数N,表示字符串P的长度。

第二行输入字符串P。

第三行输入整数M,表示字符串S的长度。

第四行输入字符串S。

输出格式
共一行,输出所有出现位置的起始下标(下标从0开始计数),整数之间用空格隔开。

数据范围
1≤N≤10^5
1≤M≤10^6

输入样例:
3

aba
5
ababa

输出样例:
0 2

 1 #include <iostream>
 2 using namespace std;
 3 
 4 const int N = 1e5 + 10;
 5 const int M = 1e6 + 10;
 6 char p[N];
 7 char s[M];
 8 int ne[N];
 9 
10 int main() {
11     int n, m;
12     cin >> n >> p + 1 >> m >> s + 1;
13     
14     for (int i = 2, j = 0; i <= n; i++) {
15         while (j && p[i] != p[j + 1]) j = ne[j];
16         if (p[i] == p[j + 1]) j++;
17         
18         ne[i] = j;
19     }
20 
21     for (int i = 1, j = 0; i <= m; i++) {
22         while (j && p[j + 1] != s[i]) j = ne[j];
23         if (p[j + 1] == s[i]) j++;
24         
25         if (j == n) {
26             cout << i - j << " ";
27             j = ne[j];
28         }
29     }
30 }