rt,WA on #13,#14
#include<bits/stdc++.h>
using namespace std;
vector<int> Next,ans;
string text,pattern;
void nextLoad(string pattern){
int prefixLen=0;
Next.push_back(0);
for(int i=1;i<pattern.size();i++){
if(pattern[i]==pattern[prefixLen]){
prefixLen++;
Next.push_back(prefixLen);
}
else if(prefixLen==0){
prefixLen=0;
Next.push_back(prefixLen);
}
else{
prefixLen=Next[prefixLen-1];
i--;
}
}
return;
}
void kmp(string text,string pattern){
int n=0,i=0;
bool check=true;
nextLoad(pattern);
while(i<text.size()){
if(text[i]==pattern[n]){
if(n>=pattern.size()-1){
ans.push_back(i-n+1);
n=Next[n];
i++;
}
else{
n++;
i++;
}
}
else{
n=Next[max(n-1,0)];
if(check&&n==0){
check=false;
}
else if(text[i]==pattern[n]){
n++;
i++;
continue;
}
else if(check==false){
i++;
continue;
}
}
}
return;
}
int main(){
cin>>text>>pattern;
kmp(text,pattern);
for(int i=0;i<ans.size();i++){
cout<<ans[i]<<endl;
}
for(int i=0;i<Next.size();i++){
cout<<Next[i]<<" ";
}
cout<<endl;
return 0;
}