题意
KMP模板,输出所有位置,kmp数组
题解
KMP
调试记录
无
#include <cstdio>
#include <cstring>
#define maxn 1000005
using namespace std;
char a[maxn], b[maxn];
int la, lb, j, kmp[maxn];
int main(){
scanf("%s%s", a + 1, b + 1);
la = strlen(a + 1), lb = strlen(b + 1);
j = 0;
for (int i = 2; i <= lb; i++){
for (; j && b[i] != b[j + 1]; j = kmp[j]);
if (b[i] == b[j + 1]) j++;
kmp[i] = j;
}
j = 0;
for (int i = 1; i <= la; i++){
for (; j && a[i] != b[j + 1]; j = kmp[j]);
if (a[i] == b[j + 1]) j++;
if (j == lb){
printf("%d\n", i - lb + 1);
j = kmp[j];
}
}
for (int i = 1; i <= lb; i++) printf("%d ", kmp[i]);
printf("\n");
return 0;
}