#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll mod = 1000000007;
#define max 100005
int p = 31;
ll hashfunction[max], power[max];
void precompute(string text, int n){
power[0]=1;
hashfunction[0] = text[0]-'a'+1;
ll pow = p;
for(int i=1; i<n; i++){
power[i] = pow;
hashfunction[i] = (hashfunction[i-1] + ((text[i]-'a'+1)*pow)%mod)%mod;
pow = (pow * p)%mod;
}
}
ll getHash(int l, int r){
if(l==0) return hashfunction[r];
else return (mod + hashfunction[r] - hashfunction[l-1])%mod;
}
ll computeHashofstring(string pattern){
ll hash_value = 0;
for(int i=0; i<pattern.length(); i++){
hash_value = (hash_value + ((pattern[i]-'a'+1)*power[i])%mod)%mod;
}
return hash_value;
}
vector<int> solve(string text, string pattern){
vector<int> v;
precompute(text, text.length());
ll hashofpattern = computeHashofstring(pattern);
int left=0, right=pattern.length()-1;
while (right<text.length())
{
if((hashofpattern*power[left])%mod == getHash(left,right)){
v.push_back(left);
}
left++,right++;
}
return v;
}
int main(){
string text, pattern;
cin >> text >> pattern;
vector<int> v = solve(text, pattern);
for(int i=0; i<v.size(); i++) cout << v[i] << '\n';
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp0eXBlZGVmIGxvbmcgbG9uZyBsbDsKbGwgbW9kID0gMTAwMDAwMDAwNzsKI2RlZmluZSBtYXggMTAwMDA1CmludCBwID0gMzE7CgpsbCBoYXNoZnVuY3Rpb25bbWF4XSwgcG93ZXJbbWF4XTsKCnZvaWQgcHJlY29tcHV0ZShzdHJpbmcgdGV4dCwgaW50IG4pewoKICAgIHBvd2VyWzBdPTE7CiAgICBoYXNoZnVuY3Rpb25bMF0gPSB0ZXh0WzBdLSdhJysxOwogICAgbGwgcG93ID0gcDsKICAgIGZvcihpbnQgaT0xOyBpPG47IGkrKyl7CiAgICAgICAgcG93ZXJbaV0gPSBwb3c7CiAgICAgICAgaGFzaGZ1bmN0aW9uW2ldID0gKGhhc2hmdW5jdGlvbltpLTFdICsgKCh0ZXh0W2ldLSdhJysxKSpwb3cpJW1vZCklbW9kOwogICAgICAgIHBvdyA9IChwb3cgKiBwKSVtb2Q7CiAgICB9Cn0KCmxsIGdldEhhc2goaW50IGwsIGludCByKXsKICAgIGlmKGw9PTApIHJldHVybiBoYXNoZnVuY3Rpb25bcl07CiAgICBlbHNlIHJldHVybiAobW9kICsgaGFzaGZ1bmN0aW9uW3JdIC0gaGFzaGZ1bmN0aW9uW2wtMV0pJW1vZDsKfQoKbGwgY29tcHV0ZUhhc2hvZnN0cmluZyhzdHJpbmcgcGF0dGVybil7CiAgICBsbCBoYXNoX3ZhbHVlID0gMDsKICAgIGZvcihpbnQgaT0wOyBpPHBhdHRlcm4ubGVuZ3RoKCk7IGkrKyl7CiAgICAgICAgaGFzaF92YWx1ZSA9IChoYXNoX3ZhbHVlICsgKChwYXR0ZXJuW2ldLSdhJysxKSpwb3dlcltpXSklbW9kKSVtb2Q7CiAgICB9CiAgICByZXR1cm4gaGFzaF92YWx1ZTsKfQoKdmVjdG9yPGludD4gc29sdmUoc3RyaW5nIHRleHQsIHN0cmluZyBwYXR0ZXJuKXsKCiAgICB2ZWN0b3I8aW50PiB2OwoKICAgIHByZWNvbXB1dGUodGV4dCwgdGV4dC5sZW5ndGgoKSk7CiAgICBsbCBoYXNob2ZwYXR0ZXJuID0gY29tcHV0ZUhhc2hvZnN0cmluZyhwYXR0ZXJuKTsKCiAgICBpbnQgbGVmdD0wLCByaWdodD1wYXR0ZXJuLmxlbmd0aCgpLTE7CiAgICB3aGlsZSAocmlnaHQ8dGV4dC5sZW5ndGgoKSkKICAgIHsgICAKICAgICAgICBpZigoaGFzaG9mcGF0dGVybipwb3dlcltsZWZ0XSklbW9kID09IGdldEhhc2gobGVmdCxyaWdodCkpewogICAgICAgICAgICB2LnB1c2hfYmFjayhsZWZ0KTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgbGVmdCsrLHJpZ2h0Kys7CiAgICB9CgogICAgcmV0dXJuIHY7Cn0KCmludCBtYWluKCl7CgogICAgc3RyaW5nIHRleHQsIHBhdHRlcm47CiAgICBjaW4gPj4gdGV4dCA+PiBwYXR0ZXJuOwoKICAgIHZlY3RvcjxpbnQ+IHYgPSBzb2x2ZSh0ZXh0LCBwYXR0ZXJuKTsKCiAgICBmb3IoaW50IGk9MDsgaTx2LnNpemUoKTsgaSsrKSBjb3V0IDw8IHZbaV0gPDwgJ1xuJzsKCiAgICByZXR1cm4gMDsKfQ==