#include <iostream>
#include <string>
using namespace std;
string s1,s2;
int next[1000005];
void getnext(){
int l=s2.size();
next[0]=0;
for(int i=1,j=0; i<l; ++i){
while(j && s2[j]!=s2[i]) j=next[j];
if(s2[j]==s2[i]) ++j;
next[i]=j;
}
return;
}
void kmp(){
getnext();
int l1=s1.size(),l2=s2.size(),last=-1;
for(int i=0,j=0; i<=l1; ++i){
while(j && s2[j]!=s1[i]) j=next[j];
if(s2[j]==s1[i]) ++j;
if(j==l2) cout << i-l2+2 << endl;
}
return;
}
int main(){
cin >> s1 >> s2;
kmp();
for(int i=0; i<s2.size(); ++i)
cout << next[i] << ' ';
return 0;
}
像
ABABA
ABA
这种就只能找到前面一个ABA,找不到后面的