# 一道扩展kmp好题

B在A中出现过，就是B的每一位和A中的连续的一段对应相等。如果我们构造一个多项式：

${c}_{i}=\sum _{j=0}^{m-1}\left({s}_{i-n+j+1}-{t}_{j}{\right)}^{2}·{t}_{j}$

${c}_{i}=\sum _{j=0}^{m-1}\left({s}_{i-j}-{t}_{j}{\right)}^{2}·{t}_{j}$

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#define ll long long
#define cp comp
using namespace std;
struct comp{
double x,y;
}h1[400010],h2[400010],g1[400010],g2[400010],ans[400010];
const double pi=acos(-1);
double aa[400010],bb[400010];
char s[100010],t[100010];
int rev[400010],len=1,bit,ksj[400010];
inline cp operator + (cp a,cp b)
{
cp ans;
ans.x=a.x+b.x;ans.y=a.y+b.y;
return ans;
}
inline cp operator - (cp a,cp b)
{
cp ans;
ans.x=a.x-b.x;ans.y=a.y-b.y;
return ans;
}
inline cp operator * (cp a,cp b)
{
cp ans;
ans.x=a.x*b.x-a.y*b.y;ans.y=a.x*b.y+a.y*b.x;
return ans;
}
inline void FFT(cp *a,int t)
{
for(int i=0;i<len;i++) if(i<rev[i]) swap(a[i],a[rev[i]]);
for(int step=1;step<len;step<<=1)
{
cp wn={cos(2*pi/step/2),sin(2*pi*t/step/2)};
for(int j=0;j<len;j+=(step<<1))
{
cp wnk={1,0};
for(int k=j;k<j+step;k++)
{
cp x=a[k],y=wnk*a[k+step];
a[k]=x+y,a[k+step]=x-y;
wnk=wnk*wn;
}
}
}
if(t==-1) for(int i=0;i<len;i++) a[i].x/=len;
}
int main()
{
scanf("%s%s",s,t);
double tmp=0;
int n=strlen(s),m=strlen(t);
while(len<(n+m)) len<<=1,bit++;
for(int i=0;i<=len;i++)
rev[i]=(rev[i>>1]>>1)|((i&1)<<bit-1);
for(int i=0;i<n;i++) aa[i]=s[i]-'a'+1;
for(int i=0;i<m;i++) if(t[i]=='*') bb[m-i-1]=0; else bb[m-i-1]=t[i]-'a'+1;
for(int i=0;i<n;i++) h2[i].x=aa[i]*aa[i],h1[i].x=2*aa[i];
for(int i=0;i<m;i++) g1[i].x=bb[i],g2[i].x=bb[i]*bb[i],tmp+=bb[i]*bb[i]*bb[i];
FFT(h1,1),FFT(h2,1),FFT(g1,1),FFT(g2,1);
for(int i=0;i<len;i++) ans[i]=(h2[i]*g1[i])-(h1[i]*g2[i]);
FFT(ans,-1);
int cnt=0;
for(int i=0;i<len;i++) if(floor(ans[i].x+0.5+tmp)==0) ksj[++cnt]=i-m+1;
cout<<cnt<<endl;
for(int i=1;i<=cnt;i++) cout<<ksj[i]<<' ';
return 0;
}