You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

27 lines
754 B

2 years ago
#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
const int M = 1000010;
int n, m, ne[N];
char s[M], p[N];
int main() {
cin >> n >> (p + 1) >> m >> (s + 1);
for (int i = 2; i <= n; i++) {
int j = ne[i - 1]; //其实这是原始版本代码等价变型后成为了831_1.cpp
// j的含义:指向当前位置前一位的失配指针位置
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) {
printf("%d ", i - n);
j = ne[j];
}
}
return 0;
}