#include<bits/stdc++.h>
using namespace std;
string s1,s2;
int l1,l2;
int nxt[10000001];
void getNext(){
int i=0;
for(int j=1;j<l1;j++){
while(s2[i]!=s2[j]&&i!=0) i=nxt[i];
if(s2[i]==s2[j]) i++;
nxt[j]=i;
}
}
void kmp(){
int i=0;
for(int j=0;j<l1;j++){
while(s1[j]!=s2[i]&&i!=0) i=nxt[i-1];
if(s1[j]==s2[i]) i++;
if(i==l2){
cout<<j-l2+2<<endl;
i=nxt[i-1];
}
}
}
int main(){
cin>>s1>>s2;
l1=s1.size();
l2=s2.size();
getNext();
kmp();
for(int i=0;i<l2;i++) cout<<nxt[i]<<" ";
return 0;
}
附:测试结果
