/*#include<bits/stdc++.h>
#define mod 666013
using namespace std;
int N;
vector <int> T[mod];
//imi definesc functia hash ca fiind h[x]=x%mod
//valorile sinonime le plasez intr-o lista inlantuita. In vectorul T pe poz i voi retine un pointer catre inceputul listei inlantuite formate din taote valorile x pentru care h[x]=i
vector<int>::iterator caut(int x)
{
int h=x%mod;
vector<int>:: iterator it;
for(it=T[h].begin();it!=T[h].end();it++)
if(*it==x) return it;
return T[h].end();
}
inline void add(int x)
{
int h=x%mod;
vector<int>::iterator it=caut(x);
if(it==T[h].end())
T[h].push_back(x);
}
inline void sterg(int x)
{
int h=x%mod;
vector<int>::iterator it=caut(x);
if(it!=T[h].end())
T[h].erase(it);
}
void read_solve()
{
int op,val;
freopen("hashuri.in","r",stdin);
freopen("hashuri.out","w",stdout);
for(scanf("%d",&N);N;N--)
{
scanf("%d %d",&op,&val);
if(op==1)
{
add(val);
continue;
}
if(op==2)
{
sterg(val);
continue;
}
printf("%d\n", caut(val)!=T[val%mod].end());
}
}
int main()
{
read_solve();
}*/
#include<bits/stdc++.h>
#define N 2000000
using namespace std;
char T[N],P[N];
int n,m,nrv;
int st[N],vf;
unsigned long putere(int d,int m)
{
int i;
unsigned long p=1;
for(i=1;i<m;i++) p*=d;
return p;
}
bool check(char *P,char *T, int k)
{
int i;
for(i=0;i<m;i++)
if(P[i]!=T[k+i]) return 0;
return 1;
}
void rabin_karp(char *T, char *P, int d, int q)
{
int i,k;
unsigned long h,p=0,t0=0;
n=strlen(T);
m=strlen(P);
h=putere(d,m)%q;
for(i=0;i<m;i++)
{
p=(d*p+P[i])%q;
t0=(d*t0+T[i])%q;
}
for(k=0;k<=n-m;k++)
{
if(p==t0)
if(check(P,T,k)) {nrv++;
st[++vf]=k;
}
t0=(t0+d*q-T[k]*h)%q;
t0=(t0*d+T[k+m])%q;
}
}
int main()
{
int i,x=-1;
freopen("strmatch.in","r",stdin);
scanf("%s \n %s", P, T);
rabin_karp(T,P,128,131);
freopen("strmatch.out","w",stdout);
cout<<nrv<<endl;
for(i=1;i<=vf;++i)
cout<<st[i]<<' ';
}