#include<iostream>
using namespace std;
string s1,s2;
int nxt[1000008],ans[1000008],tot=0;
void get_nxt()
{
int i,j=1;
nxt[1]=0;
nxt[0]=-1;
for(i=2;i<s2.length();i++)
{
while(j!=0&&s2[i]!=s2[j])
{
j=nxt[j-1]+1;
}
nxt[i]=j++;
}
return ;
}
void KMP()
{
int i,j;
i=1;
j=1;
for(;i<s1.length();)
{
while(i<s1.length()&&j<s2.length()&&s1[i]==s2[j])
{
i++;
j++;
}
if(j==s2.length())
{
ans[++tot]=i-s2.length()+1;
j=nxt[j-1]+1;
}
while(j!=0&&s1[i]!=s2[j])
{
j=nxt[j-1]+1;
}
if(j==0)
i++,j++;
}
return ;
}
int main()
{
int i,j,k;
cin>>s1>>s2;
s1=" "+s1;
s2=" "+s2;
get_nxt();
KMP();
for(i=1;i<=tot;i++)
cout<<ans[i]<<endl;
for(i=1;i<s2.length();i++)
cout<<nxt[i]<<" ";
return 0;
}
注释掉42行的if(j==0)就会算错,不注释掉就不会,不知道为什么会这样QAQ求大佬讲讲