#include <bits/stdc++.h>
using namespace std;
string text,pattern;
vector<int> nwindow;
void gen_nwindow_mapping()
{
int wsz=0;
nwindow.resize(pattern.size(),0);
for(int i=1;i<pattern.size();i++)
{
if(pattern[i]==pattern[wsz]) //when matched
{
wsz++; nwindow[i]=wsz; continue;
}
if(wsz==0) //not matched and wsz comes to zero
nwindow[i]=0;
else
{
wsz=nwindow[wsz-1];i--; //index is not incremented
}
}
}
void match_text()
{
int wsz=0;
cout<<"pattern found at indexes : ";
for(int i=0;i<text.size();i++)
{
if(text[i]==pattern[wsz])
{
wsz++;
if(wsz==pattern.size())
{
cout<<i-pattern.size()+1<<" ";
wsz=nwindow[wsz-1];
}
continue;
}
if(wsz==0)continue;
wsz=nwindow[wsz-1];
i--; //i cant be incremented till there is a match or wsz comes to zero
}
}
int main() {
cin>>text>>pattern;
gen_nwindow_mapping();
match_text();
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpzdHJpbmcgdGV4dCxwYXR0ZXJuOwp2ZWN0b3I8aW50PiBud2luZG93OwoKdm9pZCBnZW5fbndpbmRvd19tYXBwaW5nKCkKewoJaW50IHdzej0wOwoJbndpbmRvdy5yZXNpemUocGF0dGVybi5zaXplKCksMCk7Cglmb3IoaW50IGk9MTtpPHBhdHRlcm4uc2l6ZSgpO2krKykKCXsKCQlpZihwYXR0ZXJuW2ldPT1wYXR0ZXJuW3dzel0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3doZW4gbWF0Y2hlZAoJCXsKCQkJd3N6Kys7IG53aW5kb3dbaV09d3N6OyBjb250aW51ZTsKCQl9CgkJCgkJaWYod3N6PT0wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9ub3QgbWF0Y2hlZCBhbmQgd3N6IGNvbWVzIHRvIHplcm8gCgkJCW53aW5kb3dbaV09MDsJCgkJZWxzZQoJCXsKCQkJCXdzej1ud2luZG93W3dzei0xXTtpLS07ICAgICAgICAgICAgICAgICAgIC8vaW5kZXggaXMgbm90IGluY3JlbWVudGVkIAoJCX0KCX0KCQp9Cgp2b2lkIG1hdGNoX3RleHQoKQp7CglpbnQgd3N6PTA7Cgljb3V0PDwicGF0dGVybiBmb3VuZCBhdCBpbmRleGVzIDogIjsKCWZvcihpbnQgaT0wO2k8dGV4dC5zaXplKCk7aSsrKQoJewoJCWlmKHRleHRbaV09PXBhdHRlcm5bd3N6XSkKCQl7CQoJCQl3c3orKzsJCgkJCgkJCWlmKHdzej09cGF0dGVybi5zaXplKCkpCgkJCXsKCQkJCWNvdXQ8PGktcGF0dGVybi5zaXplKCkrMTw8IiAiOwoJCQkJd3N6PW53aW5kb3dbd3N6LTFdOwoJCQl9CgkJCQoJCQljb250aW51ZTsKCQl9CgkJCgkJaWYod3N6PT0wKWNvbnRpbnVlOwoJCXdzej1ud2luZG93W3dzei0xXTsKCQlpLS07ICAgICAgICAgICAgICAgICAgICAvL2kgY2FudCBiZSBpbmNyZW1lbnRlZCB0aWxsIHRoZXJlIGlzIGEgbWF0Y2ggb3Igd3N6IGNvbWVzIHRvIHplcm8KCQkKCX0KfQoKCQoKCmludCBtYWluKCkgewoJY2luPj50ZXh0Pj5wYXR0ZXJuOwoJZ2VuX253aW5kb3dfbWFwcGluZygpOwkKCW1hdGNoX3RleHQoKTsJCglyZXR1cm4gMDsKfQ==