转自:https://www.cnblogs.com/clrs97/p/4814499.html
1 #include<cstdio> 2 #include<cmath> 3 #include<algorithm> 4 #define N 1048576 5 using namespace std; 6 char sa[N],sb[N];int n,m,i,j,k,a[N],b[N],ans,q[N]; 7 struct comp{ 8 double r,i;comp(double _r=0,double _i=0){r=_r;i=_i;} 9 comp operator+(const comp&x){return comp(r+x.r,i+x.i);} 10 comp operator-(const comp&x){return comp(r-x.r,i-x.i);} 11 comp operator*(const comp&x){return comp(r*x.r-i*x.i,r*x.i+i*x.r);} 12 }A[N],B[N],C[N]; 13 const double pi=acos(-1.0); 14 void FFT(comp*a,int n,int t){ 15 for(int i=1,j=0;i<n-1;i++){ 16 for(int s=n;j^=s>>=1,~j&s;); 17 if(i<j)swap(a[i],a[j]); 18 } 19 for(int d=0;(1<<d)<n;d++){ 20 int m=1<<d,m2=m<<1; 21 double o=pi/m*t;comp _w(cos(o),sin(o)); 22 for(int i=0;i<n;i+=m2){ 23 comp w(1,0); 24 for(int j=0;j<m;j++){ 25 comp &A=a[i+j+m],&B=a[i+j],t=w*A; 26 A=B-t;B=B+t;w=w*_w; 27 } 28 } 29 } 30 if(t==-1)for(int i=0;i<n;i++)a[i].r/=n; 31 } 32 int main(){ 33 scanf("%d%d%s%s",&m,&n,sa,sb); 34 for(i=0,j=m-1;i<j;i++,j--)swap(sa[i],sa[j]); 35 for(i=0;i<m;i++)if(sa[i]!='*')a[i]=sa[i]-'a'+1; 36 for(i=0;i<n;i++)if(sb[i]!='*')b[i]=sb[i]-'a'+1; 37 for(k=1;k<n+m;k<<=1); 38 for(i=0;i<k;i++)A[i]=comp(a[i]*a[i]*a[i],0),B[i]=comp(b[i],0); 39 for(FFT(A,k,1),FFT(B,k,1),i=0;i<k;i++)C[i]=C[i]+A[i]*B[i]; 40 for(i=0;i<k;i++)A[i]=comp(a[i],0),B[i]=comp(b[i]*b[i]*b[i],0); 41 for(FFT(A,k,1),FFT(B,k,1),i=0;i<k;i++)C[i]=C[i]+A[i]*B[i]; 42 for(i=0;i<k;i++)A[i]=comp(a[i]*a[i],0),B[i]=comp(b[i]*b[i],0); 43 for(FFT(A,k,1),FFT(B,k,1),i=0;i<k;i++)C[i]=C[i]-A[i]*B[i]*comp(2,0); 44 FFT(C,k,-1); 45 for(i=m-1;i<n;i++)if(C[i].r<0.5)q[++ans]=i-m+2; 46 for(printf("%d\n",ans),i=1;i<ans;i++)printf("%d ",q[i]); 47 if(ans)printf("%d",q[ans]); 48 return 0; 49 }