。。恩 打了四五遍 不会也背出来了。。

BZOJ3160 【听说时限紧?转C++的优势么?】

上AC代码 fft

 1 /*Problem: 3160
 2     User: cyz666
 3     Language: C++
 4     Result: Accepted
 5     Time:1992 ms
 6     Memory:18492 kb
 7 ****************************************************************/
 8  
 9 #include <bits/stdc++.h>
10 #define LL long long
11 const LL mo=1000000007;
12 const double pi=acos(-1.0);
13 using namespace std;
14 struct cp{
15     double x,y;
16     cp(double a=0,double b=0):x(a),y(b){}
17     //cp(double a=0,double b=0){x=a,y=b;}
18 }a[400005],b[400005],W[200005];
19 int h[400005],rev[400005],f[200005],c[200005],n,x,m; 
20 char s; LL ans;
21 cp operator +(cp a,cp b){
22     cp c(a.x+b.x,a.y+b.y);
23     return c;
24 }
25 cp operator *(cp a,cp b){
26     cp c(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);
27     return c;
28 }
29 cp operator -(cp a,cp b){
30     return (cp){a.x-b.x,a.y-b.y};
31 }
32 void fft(cp a[],int n,int d=1){
33     if (d<0) reverse(a+1,a+n);
34     for (int i=0;i<n;++i)
35         if (i<rev[i]) swap(a[i],a[rev[i]]);
36     for (int i=0;i<n/2;++i)
37         W[i]=cp(cos(2*pi/n*i),sin(2*pi/n*i));
38     for (int m=2,k=1;m<=n;k=m,m<<=1)
39         for (int i=0;i<n;i+=m)
40         for (int j=i;j<i+k;++j){
41             cp u=a[j],v=a[j+k]*W[n/m*(j-i)];
42             a[j]=u+v,a[j+k]=u-v;
43         }
44     if (d<0) for (int i=0;i<n;++i) a[i].x/=n;
45 }
46 int main(){
47     while (scanf("%c",&s)&&isalpha(s))
48         s=='a'?c[++++n]=1:c[++++n]=2;
49     c[0]=-1; c[n+2]=-2;
50     for (int i=1;i<=n;++i){
51         if (x+f[x]>i) f[i]=min(f[x+x-i],x+f[x]-i);
52         while (c[i+f[i]]==c[i-f[i]]) ++f[i]; --f[i];
53         if (i+f[i]>x+f[x]) x=i;
54         ans+=f[i]/2; if (ans>=mo) ans-=mo;
55     }
56     m=ceil((log(n)/log(2))); m=1<<m;
57     for (int i=1;i<m;++i)rev[i]=(rev[i>>1]>>1)+(m>>1)*(i&1);
58     x=0; for (int i=2;i<=n;++++i) c[++x]=c[i]; n=x;
59     for (int i=1;i<=n;++i) c[i]==1?a[i].x=1:b[i].x=1;
60     fft(a,m);  fft(b,m);
61     for (int i=0;i<m;++i) a[i]=a[i]*a[i],b[i]=b[i]*b[i];
62     fft(a,m,-1); fft(b,m,-1);
63     h[0]=1; for (int i=1;i<=n;++i)h[i]=(h[i-1]+h[i-1])%mo;
64     int x;  ans=mo-ans; 
65     for (int i=1;i<n+n;++i){
66         x=round(a[i].x+b[i].x); 
67         ans+=h[x+1>>1]-1; if (ans>=mo) ans-=mo;
68     }
69     ans=(ans-n+1+mo)%mo;
70     printf("%lld",ans);
71     return 0;
72 }
KriTo

相关文章:

  • 2021-06-27
  • 2022-12-23
  • 2021-11-01
  • 2021-07-20
  • 2021-09-12
  • 2022-02-08
  • 2022-02-10
  • 2021-12-23
猜你喜欢
  • 2021-10-22
  • 2021-12-07
  • 2021-05-25
  • 2021-08-25
  • 2021-12-31
  • 2021-11-30
  • 2021-11-14
相关资源
相似解决方案