zoukankan      html  css  js  c++  java
  • 「BZOJ3160」万径人踪灭

    注意manacher的写法 注释掉的是TLE的代码

    1
    #include<bits/stdc++.h> 2 #define ll long long 3 #define db double 4 using namespace std; 5 const int N=150010; 6 const ll mod=1e9+7; 7 const db PI=acos(-1); 8 struct Complex{ 9 db real,image; 10 Complex(db _real=0,db _image=0):real(_real),image(_image){} 11 Complex operator+(Complex k)const{return Complex(real+k.real,image+k.image);} 12 Complex operator-(Complex k)const{return Complex(real-k.real,image-k.image);} 13 Complex operator*(Complex k)const{return Complex(real*k.real-image*k.image,real*k.image+image*k.real);} 14 Complex operator/(int k)const{return Complex(real/k,image/k);} 15 }a[N<<1],b[N<<1]; 16 int n,m,l,maxp,f[N<<1],rev[N<<1],pow2[N<<1]; 17 char s[N]; 18 void fft(Complex* x,int f){//f=1时为fft,f=-1时为ifft 19 for(int i=0;i<n;i++) if(rev[i]>i) swap(x[i],x[rev[i]]); 20 for(int len=1;len<n;len<<=1){ 21 Complex wn(cos(PI/len),f*sin(PI/len)); 22 for(int now=0;now<n-1;now+=(len<<1)){ 23 Complex w(1,0); 24 for(int i=0;i<len;i++,w=w*wn){ 25 Complex t1=x[now+i],t2=w*x[now+len+i]; 26 x[now+i]=t1+t2,x[now+len+i]=t1-t2; 27 } 28 } 29 } 30 if(f==-1) for(int i=0;i<n;i++) x[i]=x[i]/n; 31 return; 32 } 33 int maxr,pos,r[N<<1]; 34 //int manacher(){ 35 // int ans=0; 36 // s2[l2++]='#'; 37 // for(int i=0;i<l;i++) s2[l2++]=s[i],s2[l2++]='#'; 38 // for(int i=0;i<l2;i++){ 39 // r[i]=(maxr>=i)?min(maxr-i+1,r[(pos<<1)-i]):1; 40 // while(i-r[i]>=0&&i+r[i]<l2&&s2[i-r[i]]==s2[i+r[i]]) r[i]++; 41 // if(r[i]>maxr) maxr=r[i],pos=i; 42 // ans=ans+(r[i]>>1); 43 // if(ans>mod) ans-=mod; 44 // } 45 // return ans; 46 //} 47 int manacher(){ 48 int ans=0; 49 s[l+1]='#',s[0]='$'; 50 for(int i=1;i<=l;i++){ 51 if(maxr>i) r[i]=min(maxr-i+1,r[pos*2-i]); 52 else r[i]=1; 53 while(s[i+r[i]]==s[i-r[i]]) r[i]++; 54 if(i+r[i]-1>maxr) maxr=i+r[i]-1,pos=i; 55 ans=(ans+r[i])%mod; 56 } 57 maxr=0; 58 for(int i=1;i<=l;i++){ 59 if(maxr>i) r[i]=min(maxr-i,r[pos*2-i]); 60 else r[i]=0; 61 while(s[i+r[i]+1]==s[i-r[i]]) r[i]++; 62 if(i+r[i]>maxr) maxr=i+r[i],pos=i; 63 ans=(ans+r[i])%mod; 64 } 65 return ans; 66 } 67 int main(){ 68 scanf("%s",s+1); 69 l=strlen(s+1),n=l-1; 70 m=n<<1; 71 for(n=1;n<=m;n<<=1) maxp++; 72 for(int i=1;i<n;i++) rev[i]=(rev[i>>1]>>1)|((i&1)<<(maxp-1)); 73 for(int i=1;i<=l;i++) a[i-1].real=(s[i]=='a'),b[i-1].real=(s[i]=='b'); 74 fft(a,1);fft(b,1); 75 for(int i=0;i<n;i++) a[i]=a[i]*a[i],b[i]=b[i]*b[i]; 76 fft(a,-1);fft(b,-1); 77 pow2[0]=1,f[0]=int(a[0].real+b[0].real+1.1)>>1; 78 for(int i=1;i<n;i++){ 79 pow2[i]=pow2[i-1]<<1,f[i]=int(a[i].real+b[i].real+1.1)>>1; 80 if(pow2[i]>=mod) pow2[i]-=mod; 81 } 82 ll ans=0; 83 for(int i=0;i<n;i++) ans=(ans+pow2[f[i]]-1)%mod; 84 int temp=manacher(); 85 ans-=temp; 86 if(ans<0) ans+=mod; 87 printf("%lld",ans); 88 return 0; 89 }
  • 相关阅读:
    AIMS 2013中的性能报告工具不能运行的解决办法
    读懂AIMS 2013中的性能分析报告
    在线研讨会网络视频讲座 方案设计利器Autodesk Infrastructure Modeler 2013
    Using New Profiling API to Analyze Performance of AIMS 2013
    Map 3D 2013 新功能和新API WebCast视频下载
    为Autodesk Infrastructure Map Server(AIMS) Mobile Viewer创建自定义控件
    ADN新开了云计算Cloud和移动计算Mobile相关技术的博客
    JavaScript修改css样式style
    文本编辑神器awk
    jquery 开发总结1
  • 原文地址:https://www.cnblogs.com/mycups/p/8527850.html
Copyright © 2011-2022 走看看