Luogu - P3375 【模板】KMP字符串匹配
#include <bits/stdc++.h>
#define N 1000006
using namespace std;
char a[N], b[N];
int nxt[N], len_a, len_b, j;
int main() {
scanf("%s", a + 1);
scanf("%s", b + 1);
len_a = strlen(a + 1);
len_b = strlen(b + 1);
j = 0;
for (int i = 2; i <= len_b; ++i) {
while(j && b[i] != b[j + 1]) {
j = nxt[j];
}
if (b[i] == b[j + 1]) {
++j;
}
nxt[i] = j;
}
j = 0;
for(int i = 1; i <= len_a; ++i) {
while(j && a[i] != b[j + 1]) {
j = nxt[j];
}
if(a[i] == b[j + 1]) {
++j;
}
if(j == len_b) {
printf("%d\n", i - j + 1);
j = nxt[j];
}
}
for (int i = 1; i <= len_b; ++i) {
printf(" %d" + !(i - 1), nxt[i]);
}
printf("\n");
return 0;
}