#include<iostream>
#include<string.h>
using namespace std;
char a[10000008],b[10000008];
int pi[10000008];
int len1,len2;
void BuildPi(char b[],int len){
int i=-1,j=0;
pi[0]=0;
while(j<len){
if(b[i+1]==b[j+1]){
i++;j++;
pi[j]=i+1;
}
else {
if(i==-1){
j++;
pi[j]=0;
}
else i=pi[i]-1;}
}
}
void KMP(char a[],char b[],int pi[],int len1,int len2){
int i=-1,j=-1;
while(i<len1){
if(a[i+1]==b[j+1]){
i++;j++;
if(j==len2-1)cout<<i-len2+2<<endl;
}
else{
if(j==-1){
i++;
}
else j=pi[j]-1;
}
}
}
int main(){
cin>>a;
len1=strlen(a);
cin>>b;
len2=strlen(b);
BuildPi(b,len2);
KMP(a,b,pi,len1,len2);
for(int i=0;i<len2;i++){
cout<<pi[i]<<" ";
}
return 0;
}
08-07
201
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
08-07
241
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
08-07
974
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
08-07
1046
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)