const int MAXN=3e5+5;
const double pi=acos(-1.0);
struct complex{
double x,y;
complex(double x=0.0,double y=0.0):x(x),y(y){}
complex operator + (const complex &b){
return complex(x+b.x,y+b.y);
}
complex operator - (const complex &b){
return complex(x-b.x,y-b.y);
}
complex operator * (const complex &b){
return complex(x*b.x-y*b.y,x*b.y+y*b.x);
}
complex operator * (const int &b){
return complex(x*b,y*b);
}
}w[32][2];
int rev[MAXN<<2];
int build(int k){
int n,pos=0;
while((1<<pos)<=k)pos++;
n=1<<pos;
_for(i,0,n)rev[i]=(rev[i>>1]>>1)|((i&1)<<(pos-1));
for(int i=1,t=0;i<n;i<<=1,t++)
w[t][1]=complex(cos(pi/i),sin(pi/i)),w[t][0]=complex(cos(pi/i),-sin(pi/i));
return n;
}
void FFT(complex *f,int n,int type){
_for(i,0,n)if(i<rev[i])
swap(f[i],f[rev[i]]);
complex t1,t2;
for(int i=1,t=0;i<n;i<<=1,t++){
for(int j=0;j<n;j+=(i<<1)){
complex cur(1.0,0.0);
_for(k,j,j+i){
t1=f[k],t2=cur*f[k+i];
f[k]=t1+t2,f[k+i]=t1-t2;
cur=cur*w[t][type];
}
}
}
if(!type)_for(i,0,n)
f[i].x/=n;
}
complex sum[MAXN<<2];
void Mul(int *a,int _n,int *b,int _m,int k,int n){
static complex f[MAXN<<2],g[MAXN<<2];
_for(i,0,_n)f[i]=complex(a[i],0.0);
_for(i,_n,n)f[i]=complex(0.0,0.0);
_for(i,0,_m)g[i]=complex(b[i],0.0);
_for(i,_m,n)g[i]=complex(0.0,0.0);
FFT(f,n,1);FFT(g,n,1);
_for(i,0,n)f[i]=f[i]*g[i];
_for(i,0,n)sum[i]=sum[i]+f[i]*k;
}
char s1[MAXN],s2[MAXN];
int v1[MAXN],v2[MAXN],t1[MAXN],t2[MAXN];
int main()
{
int m=read_int(),n=read_int();
scanf("%s%s",s1,s2);
_for(i,0,m){
if(s1[i]=='*')v1[i]=0;
else
v1[i]=s1[i]-'a'+1;
}
reverse(v1,v1+m);
_for(i,0,n){
if(s2[i]=='*')v2[i]=0;
else
v2[i]=s2[i]-'a'+1;
}
int __n=build(n+m-2);
_for(i,0,m)t1[i]=v1[i]*v1[i]*v1[i];
_for(i,0,n)t2[i]=v2[i];
Mul(t1,m,t2,n,1,__n);
_for(i,0,m)t1[i]=v1[i]*v1[i];
_for(i,0,n)t2[i]=v2[i]*v2[i];
Mul(t1,m,t2,n,-2,__n);
_for(i,0,m)t1[i]=v1[i];
_for(i,0,n)t2[i]=v2[i]*v2[i]*v2[i];
Mul(t1,m,t2,n,1,__n);
FFT(sum,__n,0);
int cnt=0;
_for(i,m-1,n){
if(fabs(sum[i].x)<0.5)
cnt++;
}
enter(cnt);
_for(i,m-1,n){
if(fabs(sum[i].x)<0.5)
space(i-m+2);
}
return 0;
}