码迷,mamicode.com
首页 > 其他好文 > 详细

2015-7-21 模板练习

时间:2015-07-21 09:06:12      阅读:113      评论:0      收藏:0      [点我收藏+]

标签:

1.ac自动机

  1A 妈妈呀

技术分享
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<algorithm>
 5 #include<queue>
 6 #include<cstring>
 7 #define PAU putchar(‘ ‘)
 8 #define ENT putchar(‘\n‘)
 9 using namespace std;
10 const int maxn=1000000+10,inf=-1u>>1,sig=2;
11 struct node{
12     node*tx[sig],*fail;int cnt;node(){cnt=0;}
13 }ac[maxn],*nodecnt=ac,*root=nodecnt++;
14 void insert(char*s){
15     node*x=root;
16     for(int i=0;s[i];i++){
17         int c=s[i]-a;
18         if(!x->tx[c])x->tx[c]=nodecnt++;
19         x=x->tx[c];
20     }x->cnt++;return;
21 }
22 void getfail(){
23     queue<node*>Q;for(int c=0;c<sig;c++)if(root->tx[c])Q.push(root->tx[c]);
24     while(!Q.empty()){
25         node*x=Q.front();Q.pop();
26         for(int c=0;c<sig;c++)if(x->tx[c]){
27             node*p=x->fail;while(p&&!p->tx[c])p=p->fail;if(!p)p=root;
28             x->tx[c]->fail=p->tx[c]?p->tx[c]:root;Q.push(x->tx[c]);
29         }
30     }return;
31 }
32 int query(char*s){
33     node*x=root;int sum=0;
34     for(int i=0;s[i];i++){
35         int c=s[i]-a;
36         while(x&&!x->tx[c])x=x->fail;
37         x=x->tx[c];if(x->cnt)sum++;
38     }return sum;
39 }
40 inline int read(){
41     int x=0,sig=1;char ch=getchar();
42     while(!isdigit(ch)){if(ch==-) sig=-1;ch=getchar();}
43     while(isdigit(ch)) x=10*x+ch-0,ch=getchar();
44     return x*=sig;
45 }
46 inline void write(int x){
47     if(x==0){putchar(0);return;}if(x<0) putchar(-),x=-x;
48     int len=0,buf[15];while(x) buf[len++]=x%10,x/=10;
49     for(int i=len-1;i>=0;i--) putchar(buf[i]+0);return;
50 }
51 char s[maxn];
52 void init(){
53     scanf("%s",s);insert(s);getfail();
54     scanf("%s",s);write(query(s));
55     return;
56 }
57 void work(){
58     return;
59 }
60 void print(){
61     return;
62 }
63 int main(){
64     init();work();print();return 0;
65 }
ac

 2.FFT

  1RE   line42:L<L1<<1||L<L2<<1 顺序。。。

技术分享
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<algorithm>
 5 #include<queue>
 6 #include<cstring>
 7 #define PAU putchar(‘ ‘)
 8 #define ENT putchar(‘\n‘)
 9 using namespace std;
10 const int maxn=100000+10,maxt=300000+10;
11 const double pi=acos(-1.0);
12 struct fft{
13     struct cx{double r,i;cx(double _r=0.0,double _i=0.0){r=_r;i=_i;}
14         cx operator+(const cx&b){return cx(r+b.r,i+b.i);}
15         cx operator-(const cx&b){return cx(r-b.r,i-b.i);}
16         cx operator*(const cx&b){return cx(r*b.r-i*b.i,r*b.i+i*b.r);}
17     }f[maxt];int len;
18     void init(int*s,int L,int len){
19         this->len=len;for(int i=0;i<L;i++)f[i]=cx(s[L-i-1],0.0);return;
20     }
21     void change(){
22         for(int i=1,j=len>>1;i<~-len;i++){
23             if(i<j)swap(f[i],f[j]);int k=len>>1;
24             while(j>=k)j-=k,k>>=1;if(j<k)j+=k;
25         }return;
26     }
27     void cal(int tp){
28         change();double tm=-tp*2*pi;
29         for(int i=2;i<=len;i<<=1){
30             double tr=tm/i;cx wn(cos(tr),sin(tr));
31             for(int j=0;j<len;j+=i){
32                 cx w(1.0,0.0);int tn=i>>1;
33                 for(int k=j;k<j+tn;k++){
34                     cx u=f[k],t=w*f[k+tn];
35                     f[k]=u+t;f[k+tn]=u-t;w=w*wn;
36                 }
37             }
38         }if(tp<0)for(int i=0;i<len;i++)f[i].r/=len;return;
39     }
40 };
41 void mul(int*s,int*t,int L1,int L2,int*ans,int&L){
42     L=1;while(L<L1<<1||L<L2<<1)L<<=1;static fft a,b;
43     a.init(s,L1,L);b.init(t,L2,L);a.cal(1);b.cal(1);
44     for(int i=0;i<L;i++)a.f[i]=a.f[i]*b.f[i];a.cal(-1);
45     for(int i=0;i<L;i++)ans[i]=(int)(a.f[i].r+0.5);return;
46 }
47 inline int read(){
48     int x=0,sig=1;char ch=getchar();
49     while(!isdigit(ch)){if(ch==-) sig=-1;ch=getchar();}
50     while(isdigit(ch)) x=10*x+ch-0,ch=getchar();
51     return x*=sig;
52 }
53 inline void write(int x){
54     if(x==0){putchar(0);return;}if(x<0) putchar(-),x=-x;
55     int len=0,buf[15];while(x) buf[len++]=x%10,x/=10;
56     for(int i=len-1;i>=0;i--) putchar(buf[i]+0);return;
57 }
58 int s[maxn],t[maxn],ans[maxt],L1,L2,L;
59 void init(){
60     L1=read()+1;L2=read()+1;
61     for(int i=0;i<L1;i++) s[i]=read();
62     for(int i=0;i<L2;i++) t[i]=read();
63     mul(s,t,L1,L2,ans,L);
64     return;
65 }
66 void work(){
67     int lim=L1+L2-2;
68     for(L--;!ans[L]&&L&&L>lim;L--);
69     for(int i=L;i>=0;i--) write(ans[i]),PAU;
70     return;
71 }
72 void print(){
73     return;
74 }
75 int main(){init();work();print();return 0;}
FFT

 

2015-7-21 模板练习

标签:

原文地址:http://www.cnblogs.com/chxer/p/4663293.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!