#include <bits/stdc++.h>
using namespace std;
#define int long long
using pii = pair<int,int>;
struct Hash {
static const int base1 = 311, base2 = 991;
static const int mod1 = 1000000711, mod2 = 1234567891;
vector<int> pw1, pw2, h1, h2;
void assign(const string &s) {
int n = s.size();
pw1.assign(n+1,0);
pw2.assign(n+1,0);
h1.assign(n+1,0);
h2.assign(n+1,0);
pw1[0] = pw2[0] = 1;
for(int i = 1; i <= n; i++){
pw1[i] = (pw1[i-1] * 1LL * base1) % mod1;
pw2[i] = (pw2[i-1] * 1LL * base2) % mod2;
int v = s[i-1] - 'a' + 1;
h1[i] = (h1[i-1] * 1LL * base1 + v) % mod1;
h2[i] = (h2[i-1] * 1LL * base2 + v) % mod2;
}
}
pii get(int L, int R){
int x1 = (h1[R] - h1[L-1] * 1LL * pw1[R-L+1] % mod1 + mod1) % mod1;
int x2 = (h2[R] - h2[L-1] * 1LL * pw2[R-L+1] % mod2 + mod2) % mod2;
return {x1, x2};
}
};
bool equal_hash(const pii &A, const pii &B){
return A.first == B.first && A.second == B.second;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
freopen("foundstring.inp", "r", stdin);
freopen("foundstring.out", "w", stdout);
int n;
string s, y;
cin >> y >> s;
Hash a, b;
a.assign(y);
b.assign(s);
int yy = y.size(), ss = s.size();
pii tmp = a.get(1, yy);
vector<int> res;
for(int i = 1; i <= ss - yy + 1; i++){
if(tmp == b.get(i, i + yy - 1)) res.push_back(i);
}
cout << res.size() << endl;
for(int i: res) cout << i << " ";
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgaW50IGxvbmcgbG9uZwp1c2luZyBwaWkgPSBwYWlyPGludCxpbnQ+OwoKc3RydWN0IEhhc2ggewogICAgc3RhdGljIGNvbnN0IGludCBiYXNlMSA9IDMxMSwgYmFzZTIgPSA5OTE7CiAgICBzdGF0aWMgY29uc3QgaW50IG1vZDEgPSAxMDAwMDAwNzExLCBtb2QyID0gMTIzNDU2Nzg5MTsKICAgIHZlY3RvcjxpbnQ+IHB3MSwgcHcyLCBoMSwgaDI7CiAgICB2b2lkIGFzc2lnbihjb25zdCBzdHJpbmcgJnMpIHsKICAgICAgICBpbnQgbiA9IHMuc2l6ZSgpOwogICAgICAgIHB3MS5hc3NpZ24obisxLDApOwogICAgICAgIHB3Mi5hc3NpZ24obisxLDApOwogICAgICAgIGgxLmFzc2lnbihuKzEsMCk7CiAgICAgICAgaDIuYXNzaWduKG4rMSwwKTsKICAgICAgICBwdzFbMF0gPSBwdzJbMF0gPSAxOwogICAgICAgIGZvcihpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKXsKICAgICAgICAgICAgcHcxW2ldID0gKHB3MVtpLTFdICogMUxMICogYmFzZTEpICUgbW9kMTsKICAgICAgICAgICAgcHcyW2ldID0gKHB3MltpLTFdICogMUxMICogYmFzZTIpICUgbW9kMjsKICAgICAgICAgICAgaW50IHYgPSBzW2ktMV0gLSAnYScgKyAxOwogICAgICAgICAgICBoMVtpXSA9IChoMVtpLTFdICogMUxMICogYmFzZTEgKyB2KSAlIG1vZDE7CiAgICAgICAgICAgIGgyW2ldID0gKGgyW2ktMV0gKiAxTEwgKiBiYXNlMiArIHYpICUgbW9kMjsKICAgICAgICB9CiAgICB9CiAgICBwaWkgZ2V0KGludCBMLCBpbnQgUil7CiAgICAgICAgaW50IHgxID0gKGgxW1JdIC0gaDFbTC0xXSAqIDFMTCAqIHB3MVtSLUwrMV0gJSBtb2QxICsgbW9kMSkgJSBtb2QxOwogICAgICAgIGludCB4MiA9IChoMltSXSAtIGgyW0wtMV0gKiAxTEwgKiBwdzJbUi1MKzFdICUgbW9kMiArIG1vZDIpICUgbW9kMjsKICAgICAgICByZXR1cm4ge3gxLCB4Mn07CiAgICB9Cn07Cgpib29sIGVxdWFsX2hhc2goY29uc3QgcGlpICZBLCBjb25zdCBwaWkgJkIpewogICAgcmV0dXJuIEEuZmlyc3QgPT0gQi5maXJzdCAmJiBBLnNlY29uZCA9PSBCLnNlY29uZDsKfQoKc2lnbmVkIG1haW4oKXsKICAgIGlvczo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKICAgIGNpbi50aWUobnVsbHB0cik7CglmcmVvcGVuKCJmb3VuZHN0cmluZy5pbnAiLCAiciIsIHN0ZGluKTsKCWZyZW9wZW4oImZvdW5kc3RyaW5nLm91dCIsICJ3Iiwgc3Rkb3V0KTsKICAgIGludCBuOwogICAgc3RyaW5nIHMsIHk7CiAgICBjaW4gPj4geSA+PiBzOwoKICAgIEhhc2ggYSwgYjsKICAgIGEuYXNzaWduKHkpOwogICAgYi5hc3NpZ24ocyk7CgkKICAgIGludCB5eSA9IHkuc2l6ZSgpLCBzcyA9IHMuc2l6ZSgpOwogICAgcGlpIHRtcCA9IGEuZ2V0KDEsIHl5KTsKICAgIHZlY3RvcjxpbnQ+IHJlczsKICAgIGZvcihpbnQgaSA9IDE7IGkgPD0gc3MgLSB5eSArIDE7IGkrKyl7CiAgICAJaWYodG1wID09IGIuZ2V0KGksIGkgKyB5eSAtIDEpKSByZXMucHVzaF9iYWNrKGkpOwogICAgfQogICAgY291dCA8PCByZXMuc2l6ZSgpIDw8IGVuZGw7CiAgICBmb3IoaW50IGk6IHJlcykgY291dCA8PCBpIDw8ICIgIjsKICAgIHJldHVybiAwOwp9Cg==