rt,本地编译通过但洛谷RE
#include<iostream>
#include<cstring>
using namespace std;
const int MAXN = 1e7;
char s[MAXN],p[MAXN];
int next[MAXN];
void init(){
next[1]=0;
int len=strlen(p);
int i=2,j=0;
while(i<=len){
if(p[i-1]==p[j]) next[i++]=++j;
else if(i==2||!j){
next[i++]=j;
continue;
}else j=next[j];
}
}
void kmp(){
int len=strlen(s);
for(int i=0,j=0;i<len;i++){
while(s[i]!=p[j]&&j) j=next[j+1];
if(s[i]==p[j]) ++j;
if(j==strlen(p)) printf("%d\n",i-j+2),j=next[j];
}
}
int main(){
scanf("%s%s",&s,&p);
init();
kmp();
for(int i=1;i<=strlen(p);i++) printf("%d ",next[i]);
return 0;
}