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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

BZOJ3160: 万径人踪灭

發布時間:2024/10/12 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BZOJ3160: 万径人踪灭 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

設a[i]=bool(s[i]=='a'),b[i]=bool(s[i]=='b'),考慮a和a、b和b的卷積,由于卷積是對稱的,就可以統計出不連續回文子串個數了。可能說得比較簡略。再用manacher算出連續回文子串個數并減去。

#include<bits/stdc++.h> using namespace std; const int p=1e9+7; const int N=1<<18; typedef double flo; const flo pi=acos((flo)-1); struct vec{flo x,y;}; vec operator+(vec a,vec b){return{a.x+b.x,a.y+b.y};} vec operator-(vec a,vec b){return{a.x-b.x,a.y-b.y};} vec operator*(vec a,vec b){return{a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x};} void fft(vec*c,int n,int d){static int f[N];f[1]=n>>1;for(int i=2;i<n;++i){f[i]=f[i>>1]>>1|f[i&1];if(i>f[i])swap(c[i],c[f[i]]);}for(int i=1;i<n;i*=2){vec w={cos(pi/i*d),sin(pi/i*d)};for(int j=0;j<n;j+=i*2){vec s={1};for(int k=j;k<j+i;++k){vec v=s*c[k+i];c[k+i]=c[k]-v,c[k]=c[k]+v,s=s*w;}}}if(!~d)for(int i=0;i<n;++i)c[i].x/=n; } char z[N]; vec a[N],b[N]; int c[N],f[N]; int main(){scanf("%s",z);int n=strlen(z);int m=4<<__lg(n);for(int i=0;i<n;++i){a[i].x=98-z[i];b[i].x=z[i]-97;}fft(a,m,1);fft(b,m,1);for(int i=0;i<m;++i)a[i]=a[i]*a[i]+b[i]*b[i];fft(a,m,-1);for(int i=1;i<=n;++i)c[i]=(c[i-1]*2+1)%p;int s=0;for(int i=0;i<m;++i){int j=a[i].x+.5;(s+=c[(j+1)/2])%=p;}for(int i=n-1;~i;--i){z[i*2+2]=z[i];z[i*2+3]='#';}z[1]='#';z[0]='^';for(int i=1,j=0;z[i];++i){int k=j+f[j];f[i]=i<k?min(f[j*2-i],k-i):1;if(i+f[i]>=k){j=i;while(z[i-f[i]]==z[i+f[i]])++f[i];}(s+=p-f[i]/2)%=p;}printf("%d\n",s); }

轉載于:https://www.cnblogs.com/f321dd/p/5533930.html

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的BZOJ3160: 万径人踪灭的全部內容,希望文章能夠幫你解決所遇到的問題。

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