AcWing 831. KMP算法(C++注释版)
原题链接
简单
作者:
Shimmers微光
,
2021-07-16 10:46:51
,
所有人可见
,
阅读 188
#include <iostream>
using namespace std;
const int N = 1e5 + 10, M = 1e6 + 10;
int n, m;
char p[N], s[M]; //p[N]是模板串, s[M]是文本串(模式串)
int ne[N]; //避免与某个头文件中的next[]冲突导致报错
int main() {
cin >> n >> p + 1 >> m >> s + 1; //p[N]和s[M]的下标从1开始
//求next的过程
//next[1] = 0, 无最大相等前后缀, 不用算
for(int i = 2, j = 0; i <= n; i++) {
while(j && p[i] != p[j + 1]) //j没有退回起点并且p[i]与p[j+1]不匹配
j = ne[j];
if(p[i] == p[j + 1]) j++; //如果p[i]与p[j+1]匹配了, j挪到下一个位置
ne[i] = j; //记录ne[i]
}
//kmp匹配过程
for(int i = 1, j = 0; i <= m; i++) {
while(j && s[i] != p[j + 1]) //j没有退回起点并且s[i]与p[j+1]不匹配
j = ne[j];
if(s[i] == p[j + 1]) j++; //如果s[i]与p[j+1]匹配了, j挪到下一个位置
if(j == n) { //所有字符匹配成功
printf("%d ", i - n);
j = ne[j]; //继续匹配下一个
}
}
return 0;
}