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.
|
|
|
|
#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;
|
|
|
|
|
}
|