RT,只对了 30pts,怀疑自己写了假的 KMP。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char s1[1000005],s2[1000005];
int nxt[1000005],ls1,ls2;
int check(int x){
for(int i=0;i<ls2;i++)
if(s1[x+i]!=s2[i]) return i;
return ls2;
}
int main(){
cin>>s1>>s2;
ls1=strlen(s1),ls2=strlen(s2);
nxt[0]=-1;
for(int i=1;i<ls2;i++){
int j=nxt[i-1];
while(s2[j]!=s2[i]&&j!=-1){
j=nxt[j];
}
if(!j) nxt[i]=j+1;
}
nxt[0]=0;
for(int i=0;i<ls1;){
int j=check(i);
if(j==ls2) printf("%d\n",i+1);
if(j) i+=j-nxt[j-1];
else i++;
}
for(int i=0;i<ls2;i++)
printf("%d ",nxt[i]);
return 0;
}