2015-7-21 模板练习

1.ac自动机

  1A 妈妈呀

2015-7-21 模板练习
 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 顺序。。。

2015-7-21 模板练习
 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

 3.splay

  1WA   line80:瞎join了QAQ......

2015-7-21 模板练习
  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 #define CH for(int d=0;d<2;d++) if(ch[d])

 10 #define lson x->ch[0],L,M-1

 11 #define rson x->ch[1],M+1,R

 12 using namespace std;

 13 const int maxn=100000+10;

 14 struct node{

 15     node*ch[2],*fa;char x;bool rev;int siz;node(){rev=false;siz=1;x='&';}

 16     void revt(){swap(ch[0],ch[1]);rev^=1;return;}

 17     void update(){siz=1;CH{siz+=ch[d]->siz;}return;}

 18     void down(){if(rev){CH{ch[d]->revt();}rev=false;}return;}

 19 }Splay[maxn],*nodecnt=Splay,*root;

 20 int parent(node*x,node*&y){return (y=x->fa)?y->ch[1]==x?1:y->ch[0]==x?0:-1:-1;}

 21 void rotate(node*x){

 22     node*y,*z;int d1=parent(x,y),d2=parent(y,z);

 23     if(y->ch[d1]=x->ch[d1^1])y->ch[d1]->fa=y;

 24     y->fa=x;x->fa=z;x->ch[d1^1]=y;

 25     if(d2!=-1)z->ch[d2]=x;

 26     y->update();return;

 27 }

 28 void pushdown(node*x){

 29     static node*s[maxn];int top=0;

 30     for(node*y;;x=y){

 31         s[top++]=x;y=x->fa;

 32         if(!y||(y->ch[0]!=x&&y->ch[1]!=x))break;

 33     }while(top--)s[top]->down();return;

 34 }

 35 node*splay(node*x){

 36     pushdown(x);node*y,*z;int d1,d2;

 37     while(true){

 38         if((d1=parent(x,y))<0)break;

 39         if((d2=parent(y,z))<0){rotate(x);break;}

 40         if(d1==d2)rotate(y),rotate(x);

 41         else rotate(x),rotate(x);

 42     }x->update();return x;

 43 }

 44 char A[maxn];int n;

 45 void build(node*&x=root,int L=0,int R=n){

 46     if(L>R)return;x=nodecnt++;int M=L+R>>1;x->x=A[M];

 47     build(lson);build(rson);

 48     if(x->ch[0])x->ch[0]->fa=x;

 49     if(x->ch[1])x->ch[1]->fa=x;x->update();return;

 50 }

 51 void print(node*x){

 52     if(!x)return;

 53     x->down();

 54     print(x->ch[0]);

 55     putchar(x->x);

 56     print(x->ch[1]);

 57     return;

 58 }

 59 node*find(node*x,int k){

 60     x->down();int kth=x->ch[0]?x->ch[0]->siz+1:1;

 61     if(kth==k)return x;

 62     if(k<kth)return find(x->ch[0],k);

 63     return find(x->ch[1],k-kth);

 64 }

 65 node*findlas(node*x){

 66     splay(x)->down();while(x->ch[1])x=x->ch[1],x->down();return x;

 67 }

 68 void split(node*&x,node*&y,int a){

 69     if(!a){y=x;x=NULL;return;}x=find(x,a);splay(x);

 70     y=x->ch[1];x->ch[1]=NULL;if(y)y->fa=NULL;x->update();return;

 71 }

 72 void split(node*&x,node*&y,node*&z,int a,int b){

 73     split(x,z,b);split(x,y,a-1);return;

 74 }

 75 void join(node*&x,node*y){

 76     if(!x){x=y;return;}if(!y)return;x=findlas(x);splay(x);

 77     x->ch[1]=y;if(y)y->fa=x;x->update();return;

 78 }

 79 void join(node*&x,node*y,node*z){

 80     join(y,z);join(x,y);return;

 81 }

 82 void reverse(int L,int R){

 83     node*x,*y;split(root,x,y,L,R);x->revt();join(root,x,y);return;

 84 }

 85 inline int read(){

 86     int x=0,sig=1;char ch=getchar();

 87     while(!isdigit(ch)){if(ch=='-') sig=-1;ch=getchar();}

 88     while(isdigit(ch)) x=10*x+ch-'0',ch=getchar();

 89     return x*=sig;

 90 }

 91 inline void write(int x){

 92     if(x==0){putchar('0');return;}if(x<0) putchar('-'),x=-x;

 93     int len=0,buf[15];while(x) buf[len++]=x%10,x/=10;

 94     for(int i=len-1;i>=0;i--) putchar(buf[i]+'0');return;

 95 }

 96 void init(){

 97     scanf("%s",A);n=strlen(A)-1;

 98     build();

 99     return;

100 }

101 void work(){

102     int x,y,Q=read();

103     while(Q--){

104         x=read();y=read();reverse(x,y);

105     }

106     return;

107 }

108 void print(){

109     print(root);

110     return;

111 }

112 int main(){

113     init();work();print();return 0;

114 }
splay

 4.重心

  1WA   line41:f[CG]=好大

2015-7-21 模板练习
 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,inf=-1u>>1;

11 struct ted{int x,y;ted*nxt;}adj[maxn<<1],*fch[maxn],*ms=adj;

12 void add(int x,int y){

13     *ms=(ted){x,y,fch[x]};fch[x]=ms++;

14     *ms=(ted){y,x,fch[y]};fch[y]=ms++;

15     return;

16 }

17 int CG=2,siz[maxn],f[maxn],n;

18 void findcg(int x,int fa){

19     int mxs=-inf;siz[x]=1;

20     for(ted*e=fch[x];e;e=e->nxt){

21         int v=e->y;if(v!=fa){

22             findcg(v,x);siz[x]+=siz[v];

23             mxs=max(mxs,siz[v]);

24         }

25     }f[x]=max(mxs,n-siz[x]);

26     if(f[x]<f[CG])CG=x;

27     else if(f[x]==f[CG])CG=min(x,CG);return;

28 }

29 inline int read(){

30     int x=0,sig=1;char ch=getchar();

31     while(!isdigit(ch)){if(ch=='-') sig=-1;ch=getchar();}

32     while(isdigit(ch)) x=10*x+ch-'0',ch=getchar();

33     return x*=sig;

34 }

35 inline void write(int x){

36     if(x==0){putchar('0');return;}if(x<0) putchar('-'),x=-x;

37     int len=0,buf[15];while(x) buf[len++]=x%10,x/=10;

38     for(int i=len-1;i>=0;i--) putchar(buf[i]+'0');return;

39 }

40 void init(){

41     n=read();f[CG]=inf;

42     for(int i=1;i<n;i++)add(read(),read());

43     findcg(1,0);

44     write(CG);

45     return;

46 }

47 void work(){

48     return;

49 }

50 void print(){

51     return;

52 }

53 int main(){

54     init();work();print();return 0;

55 }
CG

 

你可能感兴趣的:(模板)