日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

BZOJ 4259 FFT

發布時間:2025/3/15 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BZOJ 4259 FFT 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

思路:

為什么好多字符串的題都可以用FFT啊....

我們其實是要判斷$\Sigma (a[i]-b[i])^2*a[i]*b[i]==0$

那就把a串翻轉過來 把 上式展開

大力做幾遍FFT就好啦~

//By SiriusRen #include <cmath> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define double long double const double pi=acos(-1); const int N=666666; int nn,mm,n,L,R[N],all; struct Complex{double x,y;Complex(){}Complex(double X,double Y){x=X,y=Y;} }A[N],B[N],ans[N]; Complex operator+(Complex a,Complex b){return Complex(a.x+b.x,a.y+b.y);} Complex operator-(Complex a,Complex b){return Complex(a.x-b.x,a.y-b.y);} Complex operator*(Complex a,Complex b){return Complex(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);} Complex operator/(Complex a,int b){return Complex(a.x/b,a.y/b);} void FFT(Complex *E,int f){for(int i=0;i<n;i++)if(i<R[i])swap(E[i],E[R[i]]);for(int l=1;l<n;l<<=1){Complex wn=Complex(cos(pi/l),f*sin(pi/l));for(int j=0;j<n;j+=(l<<1)){Complex w=Complex(1,0);for(int k=0;k<l;k++,w=w*wn){Complex x=E[j+k],y=w*E[j+k+l];E[j+k]=x+y,E[j+k+l]=x-y;}}}if(!~f)for(int i=0;i<n;i++)E[i]=E[i]/n; } char a[N],b[N]; int main(){scanf("%d%d%s%s",&mm,&nn,a,b);for(n=1;n<=mm+nn;n<<=1)L++;for(int i=0;i<n;i++)R[i]=(R[i>>1]>>1)|((i&1)<<(L-1));reverse(a,a+mm);for(int i=0;i<mm;i++)if(a[i]=='*')a[i]=0;else a[i]=a[i]-'a'+1;for(int i=0;i<nn;i++)if(b[i]=='*')b[i]=0;else b[i]=b[i]-'a'+1;for(int i=0;i<mm;i++)A[i].x=a[i];for(int i=0;i<nn;i++)B[i].x=b[i]*b[i]*b[i];FFT(A,1),FFT(B,1);for(int i=0;i<n;i++)ans[i]=A[i]*B[i];for(int i=0;i<n;i++)A[i].x=A[i].y=B[i].x=B[i].y=0;for(int i=0;i<mm;i++)A[i].x=a[i]*a[i]*a[i];for(int i=0;i<nn;i++)B[i].x=b[i];FFT(A,1),FFT(B,1);for(int i=0;i<n;i++)ans[i]=ans[i]+A[i]*B[i];for(int i=0;i<n;i++)A[i].x=A[i].y=B[i].x=B[i].y=0;for(int i=0;i<mm;i++)A[i].x=a[i]*a[i];for(int i=0;i<nn;i++)B[i].x=b[i]*b[i];FFT(A,1),FFT(B,1);for(int i=0;i<n;i++)ans[i]=ans[i]-A[i]*B[i]-A[i]*B[i];FFT(ans,-1);for(int i=mm-1;i<nn;i++)if(fabs(ans[i].x)<1)all++;printf("%d\n",all);for(int i=mm-1;i<nn;i++)if(fabs(ans[i].x)<1)printf("%d ",i-mm+2); }

?

轉載于:https://www.cnblogs.com/SiriusRen/p/6532747.html

總結

以上是生活随笔為你收集整理的BZOJ 4259 FFT的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。