RT,只过了样例
#include<bits/stdc++.h>
using namespace std;
const int maxn=1000005,maxm=1000005;
int nxt[maxm];
char a[maxn],b[maxm];
int n,m,ans;
void kmp(char *a,int n,char *b,int m)//下标为0
{
int i=0,j=0;
while(i<n&&j<m)
{
// printf("i=%d j=%d\n",i,j);
if(j==-1||a[i]==b[j]) i++,j++;
else j=nxt[j];
if(j==m)
{
printf("%d\n",i-m+1);
i--;
j=nxt[j];
}
}
}
void get_next(char *b,int m)
{
nxt[0]=-1;
int k=-1,j=0;
while(j<m-1)
{
if(k==-1||b[j]==b[k])
{
nxt[j]=k;
++k;
++j;
}
else k=nxt[k];
}
}
int main()
{
scanf("%s%s",a,b);
n=strlen(a); m=strlen(b);
get_next(b,m);
kmp(a,n,b,m);
for(int i=0;i<m;i++) printf("%d ",nxt[i]+1);
return 0;
}