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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

BZOJ 4259: 残缺的字符串 [FFT]

發布時間:2023/12/20 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BZOJ 4259: 残缺的字符串 [FFT] 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

4259: 殘缺的字符串

題意:s,t,星號任意字符,匹配方案數


和上題一樣
多乘上一個\(a_{j+i}\)就行了

#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std; typedef long long ll; const int N=(1<<20)+5; const double PI=acos(-1); inline int read(){char c=getchar();int x=0,f=1;while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}return x*f; }struct meow{double x, y;meow(double a=0, double b=0):x(a), y(b){} }; meow operator +(meow a, meow b) {return meow(a.x+b.x, a.y+b.y);} meow operator -(meow a, meow b) {return meow(a.x-b.x, a.y-b.y);} meow operator *(meow a, meow b) {return meow(a.x*b.x-a.y*b.y, a.x*b.y+a.y*b.x);} meow conj(meow a) {return meow(a.x, -a.y);} typedef meow cd;namespace FFT{int n, rev[N];void ini(int lim) {n=1; int k=0;while(n<lim) n<<=1, k++;for(int i=0; i<n; i++) rev[i] = (rev[i>>1]>>1) | ((i&1)<<(k-1));}void dft(cd *a, int flag) {for(int i=0; i<n; i++) if(i<rev[i]) swap(a[i], a[rev[i]]);for(int l=2; l<=n; l<<=1) {int m=l>>1; cd wn = meow(cos(2*PI/l), flag*sin(2*PI/l));for(cd *p=a; p!=a+n; p+=l) {cd w(1, 0);for(int k=0; k<m; k++) {cd t = w*p[k+m];p[k+m] = p[k] - t;p[k] = p[k] + t;w=w*wn;}}}if(flag==-1) for(int i=0; i<n; i++) a[i].x/=n;} }using FFT::dft; using FFT::ini;int n, m, lim; cd a[N], b[N], a2[N], b2[N], a3[N], b3[N], c[N]; char s[N], t[N]; int ans, li[N]; int main() {freopen("in","r",stdin);m=read(); n=read(); lim=n+m-1; ini(lim);scanf("%s%s",t,s);for(int i=0; i<n; i++) s[i]= s[i]=='*' ? 0 : s[i]-'a'+1;for(int i=0; i<m; i++) t[i]= t[i]=='*' ? 0 : t[i]-'a'+1;for(int i=0; i<n; i++) a[i].x = s[i], a2[i].x = 2*s[i]*s[i], a3[i].x = s[i]*s[i]*s[i];for(int i=0; i<m; i++) b[m-1-i].x = t[i], b2[m-1-i].x = t[i]*t[i], b3[m-1-i].x = t[i]*t[i]*t[i];dft(a, 1); dft(a2, 1); dft(a3, 1); dft(b, 1); dft(b2, 1); dft(b3, 1);for(int i=0; i<FFT::n; i++) c[i] = a3[i]*b[i] - a2[i]*b2[i] + a[i]*b3[i];dft(c, -1);for(int i=0; i<=n-m; i++) if(floor(c[m-1+i].x+0.5)==0) li[++ans]=i;printf("%d\n",ans);for(int i=1; i<=ans; i++) printf("%d ",li[i]+1); }

轉載于:https://www.cnblogs.com/candy99/p/6648749.html

總結

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

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