为方便计算,统一从下标1开始。
#include<iostream>
using namespace std;
const int N = 1e6 + 10;
char S[N];//主串
char T[N];//模式串
int s, t;
int ne[N];
void kmp()
{
for (int i = 2, j = 0; i <= t; i++)
{
while (j && T[i] != T[j + 1])j = ne[j];
if (T[i] == T[j + 1])j++;
ne[i] = j;
}
for (int i = 1, j = 0; i <= s; i++)
{
while (j && S[i] != T[j + 1])j = ne[j];
if (S[i] == T[j + 1])j++;
if (j == t)
{
printf("%d ", i - t);
j = ne[j];
}
}
}
int main()
{
cin >> t >> T + 1 >> s >> S + 1;
kmp();
return 0;
}