bzoj 4503: 两个串
和上一题一样的,这不过这个去掉一个就可以,大概是酱紫 ∑(aj-bi)*bi 就好(此处a,b可以和原题不同)
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstring> 5 #define LL long long 6 #define pi acos(-1) 7 using namespace std; 8 9 const int N=100005; 10 11 struct complex 12 { 13 double r,i; 14 complex (double x=0, double y=0) {r=x; i=y;} 15 complex operator + (const complex a) {return complex(r+a.r,i+a.i);} 16 complex operator - (const complex a) {return complex(r-a.r,i-a.i);} 17 complex operator * (const complex a) {return complex(r*a.r-i*a.i,r*a.i+i*a.r);} 18 }a[N<<2],b[N<<2],c1[N<<2],c2[N<<2],c3[N<<2]; 19 20 int n,len,lem,m,qwq; 21 int ans[N],ans1[N],ans2[N],ans3[N],A[N],B[N]; 22 int rev[N<<2]; 23 char s1[N],s2[N]; 24 25 void FFT(complex *a, int f) 26 { 27 for (int i=0; i<n; i++) if (rev[i]>i) swap(a[i],a[rev[i]]); 28 for (int h=2; h<=n; h<<=1) 29 { 30 complex wn(cos(2*pi*f/h),sin(2*pi*f/h)); 31 for (int i=0; i<n; i+=h) 32 { 33 complex w(1,0); 34 for (int j=0; j<(h>>1); j++,w=w*wn) 35 { 36 complex x=a[i+j],y=w*a[i+j+(h>>1)]; 37 a[i+j]=x+y; 38 a[i+j+(h>>1)]=x-y; 39 } 40 } 41 } 42 if (f==-1) for (int i=0; i<n; i++) a[i].r/=(double)n; 43 } 44 45 int main(int argc, char const *argv[]) 46 { 47 scanf("%s",s1); scanf("%s",s2); 48 n=strlen(s1); m=strlen(s2); qwq=n; 49 for (int i=0; i<n; i++) A[i]=s1[i]-'a'+1; 50 for (int i=0; i<m; i++) B[i]=(s2[m-i-1]=='?')?0:s2[m-i-1]-'a'+1; 51 int orz=n<<1,L=0; 52 for (n=1; n<orz; n<<=1) L++; 53 for (int i=0; i<n; i++) 54 rev[i]=(rev[i>>1]>>1)|((i&1)?n>>1:0); 55 56 for (int i=0; i<qwq; i++) a[i]=A[i]*A[i]; 57 for (int i=0; i<m; i++) b[i]=B[i]; 58 FFT(a,1); FFT(b,1); 59 for (int i=0; i<n; i++) c1[i]=a[i]*b[i]; 60 FFT(c1,-1); 61 for (int i=0; i<qwq; i++) ans1[i]=(int)(c1[i].r+0.1); 62 63 memset(a,0,sizeof(a)); 64 memset(b,0,sizeof(b)); 65 for (int i=0; i<qwq; i++) a[i]=1; 66 for (int i=0; i<m; i++) b[i]=B[i]*B[i]*B[i]; 67 FFT(a,1); FFT(b,1); 68 for (int i=0; i<n; i++) c2[i]=a[i]*b[i]; 69 FFT(c2,-1); 70 for (int i=0; i<qwq; i++) ans2[i]=(int)(c2[i].r+0.1); 71 72 memset(a,0,sizeof(a)); 73 memset(b,0,sizeof(b)); 74 for (int i=0; i<qwq; i++) a[i]=A[i]; 75 for (int i=0; i<m; i++) b[i]=B[i]*B[i]; 76 FFT(a,1); FFT(b,1); 77 for (int i=0; i<n; i++) c3[i]=a[i]*b[i]; 78 FFT(c3,-1); 79 for (int i=0; i<qwq; i++) ans3[i]=(int)(c3[i].r+0.1); 80 81 for (int i=m-1; i<qwq; i++) 82 if (ans1[i]+ans2[i]-2*ans3[i]==0) ans[++ans[0]]=i; 83 printf("%d\n",ans[0]); 84 for (int i=1; i<=ans[0]; i++) printf("%d\n",ans[i]-m+1); 85 return 0; 86 }