最后一个点TLE
#include<iostream>
#include<cstring>
using namespace std;
char s1[1000001],s2[1000001];
int l1,l2,kmp[1000001],s,k;
bool tf=true;
int main(){
scanf("%s%s",s1+1,s2+1);
l1=strlen(s1+1);
l2=strlen(s2+1);
for(int i=2;i<=l2;i++){
while(k>0 && s2[i]!=s2[k+1]){
k=kmp[k];
}
if(s2[i]==s2[k+1]){
k++;
}
kmp[i]=k;
}
for(int i=1;i<=l1;i++){
for(int j=1;j<=l2;j++){
if(s1[j+i-1]!=s2[j]){
tf=false;
break;
}
}
if(tf==true){
printf("%d\n",i);
}
tf=true;
}
for(int i=1;i<l2;i++){
printf("%d ",kmp[i]);
}
printf("%d",kmp[l2]);
return 0;
}