为啥70分
代码:
#include<bits/stdc++.h>
using namespace std;
int n,m,nxt[2100001],f[2100001];
char s[2100002],p[2100002];
inline void kmp(){
n=strlen(s+1);
m=strlen(p+1);
int j=0;
nxt[1]=0;
for(int i=2;i<=m;i++){
while(j&&p[i]!=p[j+1]){
j=nxt[j];
}
if(p[i]==p[j+1]){
++j;
}
nxt[i]=j;
}
j=0;
for(int i=1;i<=n;i++){
if(j==m||(j&&s[i]!=p[j+1])){
j=nxt[j];
}
if(s[i]==p[j+1]){
++j;
}
f[i]=j;
}
int ans=0;
for(int i=1;i<=n;i++){
if(f[i]==m){
printf("%d\n",i-m+1);
}
}
for(int i=1;i<=m;i++){
printf("%d ",nxt[i]);
}
}
int main(){
// freopen("P3375_13.in","r",stdin);
// freopen("P3375_13.out","w",stdout);
scanf("%s%s",s+1,p+1);
kmp();
return 0;
}