#include <iostream>
#include <cstring>
using namespace std;
char A[1000000],B[1000000];
int Next[1000000]={0};
int main()
{
scanf("%s",A);
scanf("%s",B);
int len=strlen(B);
int flag=0;
for(int i=1;i<len;i++)
{
for(;flag&&B[flag]!=B[i];)
{
flag=Next[flag];
}
if(B[i]==B[flag])
{
flag++;
Next[i]=flag;
}
}
int len_1=strlen(A);
for(int i=0,j=0;i<=len_1+1;i++)
{
while(j&&A[i]!=B[j])
{
if(j-1==-1)
{
j=0;
}
else
{
j=Next[j-1];
}
}
if(A[i]==B[j])
{
j++;
}
if(j==len)
{
printf("%d\n",i-len+2);
if(j-1==-1)
{
j=0;
}
else
{
j=Next[j-1];
}
}
}
for(int i=0;i<len;i++)
{
printf("%d ",Next[i]);
}
return 0;
}
WA+TLE了。刚刚开始学KMP,有点懵,有无大佬帮忙看看哪个地方出问题了。