原题链接:
题解:
这个理解比较抽象,可以参考下面的讲解:
评价:
很难评这个算法,不过模板倒是很容易记
代码:
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
const int M = 1e6 + 10;
char s[M], p[N];
int ne[M];
int main() {
int n, m;
cin >> n >> p + 1 >> m >> s + 1;
//ne数组
for (int i = 2, j = 0;i <= n;i++) {
while (j && p[i] != p[j + 1]) j = ne[j];
if (p[i] == p[j + 1]) j++;
ne[i] = j;
}
//匹配
for (int i = 1, j = 0;i <= m;i++) {
while (j && s[i] != p[j + 1]) j = ne[j];
if (s[i] == p[j + 1]) j++;
if (j == n) {
cout << i - n << " ";
j = ne[j];
}
}
}