首页 写随笔

cdcq(本博客废弃!现用博客:https://www.cnblogs.com/cdcq/)

本博客废弃!现用博客:https://www.cnblogs.com/cdcq/

导航

模板重搭建計劃

之前模板好多青涩的地方,和我现在的风格差别也比较大,现在重新搭一个模板,同时复习模板

一定程度上减少被hack的几率:

  1 /*
  2                                     :Zu
  3                                    iB@B@i                                                                                      iGM;
  4                                   i@@B@@@B2                                                                                 7B@B@B@.
  5                                   @@@@B@B@B@u                                                                            iM@B@B@B@BL
  6                                  B@B@N  OB@@@BY                                                                        F@@@B@BMM@B@O
  7                                 E@B@B    .O@B@B@:                                                                   :BB@@@B@0U7FB@B@
  8                                :@B@B.      .@B@B@O                                                                YB@B@B@OSYJjuU@B@B
  9                                @B@B5         rB@B@B7                                                            u@B@B@BNuYj1UFuuB@B@i
 10                               2@@@@            N@@@@M                                                         5B@B@BBkjYU252511JMB@B1
 11                               @@B@i             :@@@B@                                                      J@B@@@MFLju515151FUJE@B@M
 12                              F@B@B                @@@B@,                                                  iB@B@@B1YJ12F152F1511JPB@B@
 13                              @B@B:                 EB@@@.                            . .::::....         O@@B@BSLuU51F151F15152u2@B@B
 14                             L@@B@                   0B@B@        .:rLuk8MB@B@B@B@B@B@@@B@B@B@B@@@@@B@B@G@@@B@PuY2251F1F151F1F1Fu2B@B@.
 15                             B@@@Y                    @B@BB2MB@B@@@B@B@B@B@B@B@B@B@B@B@B@B@B@B@B@B@B@B@B@B@BMujU52F1F151525151511Y@@@Bi
 16                             @B@B                      @B@@@B@@@B@@@B@@@BBZNuu7ri:,,..        B@B@0kN88MB@BEYu252525151F252F1F15UJM@B@J
 17                            JB@B@                      0@B@@BE17i,.                           @B@BUvJYJLJjUj125151F152525151F1F55YO@@BX
 18                            B@B@v                                                            .B@B@jUU5252221212F2515251F15252F1F2JE@B@O
 19                            @B@B.                                                             @B@BFJF1F2F2F2F2515151F152F251F5515YEB@B@
 20                           .B@@@                                                              B@B@ELU52F152F251525151515252F1F2F2JX@B@B
 21                           v@B@B                                                              vB@B@uj255F15151F2F15252515151F1S15JNB@B@
 22                           PB@BX                                                               @B@BBYu2F1F1F2F15152F2515151F152F1jP@B@B
 23                           B@B@v                                                                @B@BBjJu5251S25151F15251515151F15JNB@@B
 24                           BB@@:                                                                 @B@B@XYL2UF151F15151F2F251F2F251j0@B@B
 25                           B@B@i                                                                  @B@B@BPJJJU251111152525152121Uuv1B@B@B.
 26                         FB@B@B                                                                    vB@B@B@ZSjjLujUu1U1u2u2uuJJLj2XZ@@@B@@:
 27                        @B@B@u                                                                       v@@@B@B@MOXkuujuJjJuu55qEMB@@@B@B@B@Bi
 28                      :@B@B@                                                                           :P@B@B@@@B@B@B@B@B@B@@@B@B@B@U L@B@Bi
 29                     r@B@BE                                                                               .vO@@B@B@B@B@B@B@B@B@MU:     Y@B@B,
 30                    r@B@Bu                                                                                      ,rL52F15Uv;:            k@B@B
 31                   ,@@@BJ                                                          :BB1                                                  B@B@M
 32       .           @B@BP                               .5X,                        @B@B@Bv                                                B@B@:
 33     r@B@@@@Mu:   BB@B@                               .B@B@                        .8B@B@B@BF,                                            uB@B@
 34     7B@B@B@@@B@B8B@@@                               7B@B@M                           iMB@B@@@B@Xr.                                        @B@B:
 35       .:iJZ@B@B@B@@@k                            :5@B@B@X                               ,SB@B@B@B@B@BPYi..                                P@B@Z
 36              .rB@B@B@BMi             r@BONE0EM@B@B@B@B@:                                    i5@B@@@B@B@B@@@B@                             :B@B@
 37                @B@B@B@B@O            @B@B@B@@@@@B@@@5.                                           :LEB@B@B@B@B:                             @B@B
 38               iB@B@ iB@B7            :ZM@B@B@BO57,                                                       .:i                               B@B@ii2OOk
 39               M@B@2                                                                                                                        @B@B@B@B@@@
 40               @B@B.                                                                   .jOM07                                           .UB@B@B@B@@@B@r
 41              .B@B@                                                                   MB@B@@@B7                                        M@B@B@B@Bi
 42              r@B@B                                7O@@BJ                            SB@B@B@B@B.                                       PB@BP@@B@
 43              uB@BO                               @@@B@B@Br                          8@@@B@B@B@:                                            @B@B
 44              S@@@F                              @B@B@B@B@@                          .B@B@B@B@B                                            ZB@Bk
 45              SB@B1                              B@B@B@B@@@                            5@B@B@7                                             B@B@.
 46              v@B@k                              .B@@@@@B@r                                                                               2@B@B
 47              vB@B@:r7;                            vBB@BF                                                                                 @B@B:
 48     :71Z@B@B@B@B@B@B@BM                                                                                                                 8B@BE
 49 v@B@B@B@@@B@B@@@B@B@B@r                                                                                                            @B@B@B@@@:
 50 @B@B@B@BMFJi: MB@BJ                                                                                                               .B@B@B@B@@@B@Ov
 51  .7:          :@B@@                                                                                                                  ;@@B@B@B@B@@@@2
 52                B@B@v                                                                                                                 Z@@@B  ,LMB@B@B@r
 53                rB@B@                                                                                                                B@B@B       .EB@B@
 54                 @B@BM                                                                                                             .B@B@B          .M@j
 55                  @B@B1                                                                                                           rB@@@M
 56                  :@B@Bj                                              i8B@B@B@B@B@Bu                                             GB@B@F
 57                   i@B@BX                                            M@@@B@@@B@B@B@B@                                          :@@@B@i
 58                    i@B@B@                                           7B@BFri:,:ivOB@X                                        ,B@B@BM
 59                     .@B@B@L                                                                                               ,BB@@@Bi
 60                       qB@B@@7                                                                                           jB@B@B@L
 61                        :B@B@B@2.                                                                                     JB@@@B@Bv
 62                          :@B@B@B@u.                                                                              ,FB@B@B@BP,
 63                            .S@B@B@B@0r                                                                       :jBB@B@B@@@B.
 64                               :P@B@B@B@BOv,                                                          .:7kO@B@B@B@@@B@B@@@
 65                                  .vBB@B@B@@@B@ONjr:,                                       ,:rYXE@B@@@@@@@B@@@B@MEuri@@@B.
 66                                      J@B@B@B@B@B@@@@@B@B@B@@BM8ENFPFUuUuuuU5XFP0GOMB@B@B@B@B@@@B@B@B@B@B@BMX2vr::::,iB@B@
 67                                      rB@BM71NMB@B@B@@@B@@@@@B@B@B@B@B@@@B@@@B@@@B@B@B@B@@@B@@@B@BBZqULri:::::::;;rr:r@B@B.
 68                                      u@B@E.,::::iirvLJFFN0OOMM@B@BMO@B@B@@@B@B@@@@@B@MuL2JY77ii:::::::ii;irrrr7r7rr:iB@B@.
 69                                      1B@BZ,;rr;;ii:i::::::::::::,.:Z@@B@B@quLYJqB@B@B@q: ::::ii;;rrrr7rrr7r7rrii::::u@B@B.
 70                                      F@@@P.::i;rrrrrrrrrr;r;r;ri,7@@@@@u.         L@@B@BL,rr7r7r7r7rrrrrrii::::iLSBB@B@B@:
 71                                      OB@B@EF7;::,::ii;ir;rrrrr;:7@B@BO   .....      N@@@BL:rrrrri;ii:::::irLF8B@B@B@B@B@Bv
 72                                      Z@B@@@B@B@MZ5J7ri:::,:::::,@B@@E  .,,:,,..      N@B@B,.:::::i;7j2NO@B@B@B@B@B@E:F@B@P
 73                                      @B@BBB@@@B@B@B@@@B@MOqX1u7UB@B@  .:,,,,..  ,.    B@B@k1NOM@B@B@@@B@B@B@B@BSi    iB@B@
 74                                     iB@B@   iYG@@@@B@@@B@B@@@B@B@B@M  ,,:,,., rB@B@5. ZB@B@B@B@@@B@@@B@BBF7,          @B@B
 75                                     B@B@u          :rjSO@@B@B@B@B@B@  .,,,.,. r@@@@@B8M@B@B@B@BOFu;:.                 B@B@i
 76                                    S@B@B                        @B@@r  .......  :5@B@B@B@B                            5B@BB
 77                                   L@@@B,                        7@B@Bi   . . .     .B@B@Bu                             @B@@.
 78                                  G@B@B;                          q@B@Bk            7@B@BM                              G@B@@
 79                                 B@B@B:                            L@B@B@O7.    .rOB@B@Bu                                B@B@B
 80                                 qB@M                                ZB@B@@@B@@@B@B@B@Z                                  .B@@@B
 81                                                                       7MB@B@B@B@B@Mv                                      S@8.
 82                                                                           ,:7ri.
 83 
 84 
 85                          ...                    .                                     ..        ..
 86                   :7FB2  B@B   r.              :@B.                                  L@@        @B                      ,.,.,..
 87          .@@@@B@B@B@@@B  OB@  L@BO             j@@      B@B@B@B@B@B@@@B@     0PXSXSSJMB@L5FXSSuNB@u5SXSXXZi     ,,,,., iB@B@@@@ B@B@B@B@@@B@M
 88           @BOurE@B       F@B    M@@M:          O@i      :::,:,,..  :@B@O     @@@@B@@@B@B@B@B@B@@@B@B@@@B@B2     @B@B@B .@E  .B@ .,,.... @BL..
 89                rBB       rB@      B@Y      vEFL@BNuF2uj           u@BX               .B5        F5              B@  B@  BE  O@.         q@
 90                v@B       :@@               E@B@B@B@B@@@         XB@P           k1jujjSMG0qPqMB@BBB@B@B@v        @B  B@  @0  @B  iLUUuY. ZB,
 91          @B@B@B@B@B@B@@@B@B@B@B@B@B@B@B       L@u   .@B        @@@             @B@B@BBOMOM@E2PXqkLi:vi,.        @@  B@  Bq 0B,  B@@@@@Y N@:
 92          ii::,.S@B .:,:,.:@@i.::,.   ,i       @B.   JBq        0@1               iJ      r@Y        @@          @B  @B  @1 B@   MB  .B7 NB:
 93                7B@        @@      :@7        :@@    B@i.:::::: MBO ,::::i        MB@      B@O     E@B7          B@  B@  Bk @B:  O@  ,@r k@,
 94                r@M    r5  @Bu    5@Bk        M@v    @B B@B@B@B@B@@@B@B@B@:        5B@.     BE   r@@F            @B  @B  @E  @B  OB. :B7 PB:
 95              ,:MB@B@B@B@. U@B  .@@@.        .@B    PB8         E@q                 ;i     .O;    J              B@  B@  B8  :@q E@  .@r k@,
 96          B@B@@@B@BPu7,     B@ uB@5           v@@S  B@          E@E           UEkk5277J1YvrBB@r7LYrLUFFkkqE:     @B  MB  @Z   B@ PBi YBv NB:
 97          0Mui. LBB         MB@BB               7B@B@:          OBO           @B@B@B@B@O@B@B@B@B@O@B@B@@@B@;     @@  @@ .@0   @B P@B@B@v N@:
 98                v@B        qB@Br     iXi          B@BP          8@O                    7@@ iBX @Bi               @B@B@B  @B7v@BG @B:     OB:
 99                JB@     JB@B51@B     M@@        LB@:rB@Bi       GBM                 ,B@BL  r@8  vB@8,           .@@  5@ .@Gq@Bv   ,      Z@:
100                L@B  PB@B@J   M@B.   @@7      i@B@    0@7       B@M              iO@@@r    YBB    r@B@BY.        :.     :@q              MB:
101           G@N5S@BB  Z@S.      P@BZ.uB@     ,B@B7         UB@B@@@B:           OB@@@5       j@B       L@B@B@,            iBB         FMq1OB@
102           2B@B@MJ              :@B@B@:      Sj            NFXF5i             ,@u          qB@          .Y.             i@O         Y@B@BZ.
103                                   ..                                                      :Ur
104 
105 
106 
107                            k   :..,,       r  ii      v:   ir .L         E         ..,,:,iivv    :..   ,F      :  u   .:iu1
108                         .u5BjL:i@@rB@     @k  :Bi    7@Bu. uMiNBuL ,@SSuEB5qZUO8  :qN1uM@7777:  :v@B i2X@vS@   Bv @ 7B7v7i:
109                           .@   ,B  UB   v@:     BX   Li O O7u 2 O.  28 .Br,S :B.  r7vvrE@7vjLL   :B  Yiv@:7@j  BqiB 7B
110                         :LuB27i8  uG  .B@r..:ii,,F@: JO1@ 0;F B7@:   Lr rOui k.    M1::2@:ii@   ,BqF  i7@,78   ON.. rB@Y7Z@
111                          2 @r  NY55E:    r:@B77rBr   :2@.v1ik .@.,  uM ,OG:Bq Br   @5::2@,:iB,  ,, @ :;vBiii   @8ir vJY7 Mu
112                          B 8E7 B   0O     .@    @i   :@B7  Mi 5B5: .P: i,BF j i2   5Yi:F@:ii8   .B7G 77J@rvJ:  B7 @ P7 BPG
113                         :@k@.  @v7rO7    2B     B     B,  i@   @   iJujLr@G77uJU  .7r7iNBi;7rr   uBL :.:B  .. .@  B B  BBJ
114                         @i 1ZXqkEq0X0  7@P  qk0B5    BE  7@    B         B7       ZXF2U8@j11k0r YB.rSuuuGjUkX 1P  @PXv@i X@:
115                                             .,.                          .
116 
117 
118 
119 */
View Code

对拍:

 1 @echo off
 2 
 3 set path=C:\Windows\System32
 4 
 5 :loop
 6 
 7 data.exe
 8 ddd.exe
 9 PIA.exe
10 
11 fc ddd.out PIA.out
12 
13 if not errorlevel 1 goto loop
14 
15 pause
16 
17 goto loop
View Code

linux下的对拍:

 1 #!/bin/sh
 2 while true; do
 3 ./data>ddd.in
 4 ./ddd<ddd.in>ddd.out
 5 ./pia<ddd.in>pia.out
 6 if diff ddd.out pia.out; then
 7 echo 没问题
 8 else
 9 echo 有问题
10 exit 0
11 fi
12 done
View Code

 线段树:

 1 int a[110000];
 2 struct ddd{int tleft,tright,mid,tvalue,delta;}tree[510000];
 3 void delta_push(int x){
 4     tree[x<<1].delta+=tree[x].delta,tree[x<<1|1].delta+=tree[x].delta;
 5     tree[x<<1].tvalue+=tree[x].delta,tree[x<<1|1].tvalue+=tree[x].delta;
 6     tree[x].delta=0;
 7 }
 8 void get_SegmentTree(int x,int _left,int _right){
 9     tree[x].tleft=_left,tree[x].tright=_right,tree[x].mid=(_left+_right)>>1,tree[x].delta=0;
10     if(_left==_right)  tree[x].tvalue=a[_left];
11     else{
12         get_SegmentTree(x<<1,_left,tree[x].mid),get_SegmentTree(x<<1|1,tree[x].mid+1,_right);
13         tree[x].tvalue=max(tree[x<<1].tvalue,tree[x<<1|1].tvalue);
14     }
15 }
16 int search(int x,int _left,int _right){
17     if(tree[x].tvalue==_left && tree[x].tright=_right)  return tree[x].tvalue;
18     else{
19         delta_push(x);
20         if(_left<=tree[x].mid && _right>tree[x].mid)  return max(search(x<<1,_left,tree[x].mid),search(x<<1|1,tree[x].mid+1,_right));
21         else if(_right<=tree[x].mid)  return search(x<<1,_left,_right);
22         else  return search(x<<1|1,_left,_right);
23     }
24 }
25 void buff(int x,int _left,int _right,int z){
26     if(tree[x].tleft==_left && tree[x].tright==_right)  tree[x].tvalue+=z,tree[x].delta+=z;
27     else{
28         delta_push(x);
29         if(_left<=tree[x].mid && _right>tree[x].mid)  buff(x<<1,_left,tree[x].mid,z),buff(x<<1|1,tree[x].mid+1,_right);
30         else if(_right<=tree[x].mid)  buff(x<<1,_left,_right,z);
31         else  buff(x<<1|1,_left,_right,z);
32     }
33 }
View Code

 SPFA:

 1 struct ddd{int next,y,evalue;}e[210000];  int LINK[110000],ltop=0;
 2 inline void insert(int x,int y,int z){e[++ltop].next=LINK[x];LINK[x]=ltop;e[ltop].y=y;e[ltop].evalue=z;}
 3 int dui[110000],tou=0;
 4 bool visited[110000];
 5 int dist[1100000];//注意节点可能会重复进队
 6 void SPFA(int x){//本质就是如果这个点可以松弛就松弛,如果不在队里就进队
 7     memset(visited,0,sizeof(visited));
 8     memset(dist,0,sizeof(dist));
 9     dui[tou=1]=x;  dist[x]=0;
10     for(int k=1;k<=tou;k++){
11         visited[dui[k]]=false;
12         for(int i=LINK[dui[k]];i;i=e[i].next)
13             if(dist[dui[k]]+e[i].evalue < dist[e[i].y]){
14                 dist[e[i].y]=dist[dui[k]]+e[i].evalue;
15                 if(!visited[e[i].y])  dui[++tou]=e[i].y,visited[e[i].y]=true;
16             }
17     }
18 }
View Code

 并查集:

 1 int ji[110000];
 2 int cha(int x){
 3     int _ji=x;
 4     while(ji[_ji]!=_ji)  _ji=ji[_ji];
 5     while(x!=_ji){
 6         int temp=ji[x];
 7         ji[x]=_ji;
 8         x=temp;
 9     }
10     return _ji;
11 }
12 int bing(int x,int y){
13     x=cha(x),y=cha(y);
14     ji[y]=x;
15 }
View Code

 dinic:

 1 const int oo=168430090;
 2 struct ddd{int next,y,evalue,fan;}e[1100000];  int LINK[510000],ltop=0;
 3 inline void insert(int x,int y,int z){
 4     e[++ltop].next=LINK[x];LINK[x]=ltop;e[ltop].y=y;
 5     e[ltop].evalue=z;e[ltop].fan=ltop+1;
 6     e[++ltop].next=LINK[y];LINK[y]=ltop;e[ltop].y=x;
 7     e[ltop].evalue=0;e[ltop].fan=ltop-1;
 8 }
 9 int n,m;
10 int s,t;
11 int dui[510000],tou=0;
12 int level[510000];
13 bool get_level(){
14     memset(level,-1,sizeof(level));
15     dui[tou=1]=s;  level[s]=0;
16     for(int k=1;k<=tou;k++)
17         for(int i=LINK[dui[k]];i;i=e[i].next)
18             if(e[i].evalue && level[e[i].y]==-1){
19                 level[e[i].y]=level[dui[k]]+1;
20                 dui[++tou]=e[i].y;
21             }
22     return level[t]!=-1;
23 }
24 int max_flow(int x,int y){
25     if(x==t)  return y;
26     int maxflow=0,flow;
27     for(int i=LINK[x];i && maxflow<y;i=e[i].next)
28         if(level[e[i].y]==level[x]+1 && e[i].evalue)
29             if(flow=max_flow(e[i].y,min(y-maxflow,e[i].evalue))){
30                 maxflow+=flow;
31                 e[i].evalue-=flow,e[e[i].fan].evalue+=flow;
32             }
33     if(!maxflow)  level[x]=-1;
34     return maxflow;
35 }
36 int dinic(){
37     int bowl=0,flow;
38     while(get_level())while(flow=max_flow(s,oo))bowl+=flow;
39     return bowl;
40 }
View Code

 快速幂:

1 long long fast_mi(long long x,long long y){
2     long long base=x,z=1;
3     while(y){
4         if(y&1)  z*=base;
5         base*=base;
6     }
7     return z;
8 }
View Code

 SBT:

 1 struct dcd{int lchild,rchild,size,tvalue;}tree[110000];  int ttop=0,root=0;
 2 void left_rotate(int &x){
 3     int y=tree[x].rchild;
 4     tree[x].rchild=tree[y].lchild;
 5     tree[y].lchild=x;
 6     tree[y].size=tree[x].size;
 7     tree[x].size=tree[tree[x].lchild].size+tree[tree[x].rchild].size+1;
 8     x=y;
 9 }
10 void right_rotate(int &x){
11     int y=tree[x].lchild;
12     tree[x].lchild=tree[y].rchild;
13     tree[y].rchild=x;
14     tree[y].size=tree[x].size;
15     tree[x].size=tree[tree[x].lchild].size+tree[tree[x].rchild].size+1;
16     x=y;
17 }
18 void smaintain(int &x,bool _flag){
19     if(!_flag){
20         if(tree[tree[tree[x].lchild].lchild].size>tree[tree[x].rchild].size)  right_rotate(x);
21         else if(tree[tree[tree[x].lchild].rchild].size>tree[tree[x].rchild].size)  left_rotate(tree[x].lchild),right_rotate(x);
22         else  return ;
23     }
24     else{
25         if(tree[tree[tree[x].rchild].rchild].size>tree[tree[x].lchild].size)  left_rotate(x);
26         else if(tree[tree[tree[x].rchild].lchild].size>tree[tree[x].lchild].size)  right_rotate(tree[x].rchild),left_rotate(x);
27         else  return ;
28     }
29     smaintain(tree[x].lchild,false),smaintain(tree[x].rchild,true);
30     smaintain(x,true),smaintain(x,false);
31 }
32 void insert(int &x,int _value){
33     if(!x){
34         x=++ttop;
35         tree[x].lchild=tree[x].rchild=0;
36         tree[x].size=1;
37         tree[x].tvalue=_value;
38     }
39     else{
40         tree[x].size++;
41         if(_value<=tree[x].tvalue)  insert(tree[x].lchild,_value);
42         else  insert(tree[x].rchild,_value);
43         smaintain(x,_value>tree[x].tvalue);
44     }
45 }
46 void remove(int &x,int z){
47     if(!x)  return ;
48     tree[x].size--;
49     if(z<tree[x].tvalue)  remove(tree[x].lchild,z);
50     else if(z>tree[x].tvalue)  remove(tree[x].rchild,z);
51     else{
52         if(!tree[x].lchild && !tree[x].rchild)  x=0;
53         else if(!(tree[x].lchild*tree[x].rchild))  x=tree[x].lchild+tree[x].rchild;
54         else{
55             int temp=tree[x].rchild;
56             while(tree[temp].lchild)  temp=tree[temp].lchild;
57             tree[x].tvalue=tree[temp].tvalue;
58             remove(tree[x].rchild,tree[temp].tvalue);
59         }
60     }
61 }
62 int select(int &x,int y){
63     if(!x)  return -1;
64     if(y<=tree[tree[x].lchild].size)  return select(tree[x].lchild,y);
65     else if(y>tree[tree[x].lchild].size+1)  return select(tree[x].rchild,y-tree[tree[x].lchild].size-1);
66     else  return tree[x].tvalue+bowl;
67 }
68 int rank(int &x,int y){//不知道对不对,应该对了(吧)
69     if(!x)  return -999999999;
70     if(y<tree[x].tvalue)  return search(tree[x].lchild,y);
71     else if(y>tree[x].tvalue)  return search(tree[x].rchild,y)+tree[tree[x].lchild].size+1;
72     else  return tree[tree[x].lchild].size+1;
73 }
View Code

 kmp:

 1 char s[110000];  int n=0;
 2 char a[110000];  int l=0;
 3 int next[110000];
 4 void get_next(){
 5     int temp=next[0]=-1;
 6     for(int i=1;i<n;i++){
 7         while(temp>-1 && s[temp+1]!=s[i])  temp=next[temp];
 8         temp+=(s[temp+1]==s[i]);
 9         next[i]=temp;
10     }
11 }
12 int kmp(){
13     int temp=-1;
14     for(int i=0;i<l;i++){
15         while(temp>-1 && s[temp+1]!=a[i])  temp=next[temp];
16         temp+=(s[temp+1]==a[i]);
17         if(temp==n-1)  return i;//temp=next[temp];
18     }
19 }
View Code

 万进制(输入,乘法,输出,除单精):

 1 乘法:
 2 const int ss=10000;
 3 char _a[110],_b[110];  int _la=0,_lb=0;
 4 int a[110],b[110],la=0,lb=0;
 5 int c[110],lc=0;
 6 void multiply(){
 7     lc=la+lb-1;
 8     for(int i=1;i<=la;i++)
 9         for(int j=1;j<=lb;j++){
10             c[i+j-1]+=a[i]*b[j];
11             c[i+j]+=c[i+j-1]/ss,c[i+j-1]%=ss;
12         }
13     //for(int i=1;i<=lc;i++)  c[i+1]+=c[i]/ss,c[i]%=ss;最后再处理容易爆掉
14     while(c[lc+1])  lc++,c[lc+1]+=c[lc]/ss,c[lc]%=ss;
15 }
16 
17 输入:
18 
19     scanf("%s%s",_a+1,_b+1);  _la=strlen(_a+1),_lb=strlen(_b+1);
20     for(int i=_la;i>=1;i-=4){
21         la++;
22         for(int j=max(i-3,1);j<=i;j++)
23             a[la]=(a[la]<<3)+(a[la]<<1)+_a[j]-'0';
24     }
25     for(int i=_lb;i>=1;i-=4){
26         lb++;
27         for(int j=max(i-3,1);j<=i;j++)
28             b[lb]=(b[lb]<<3)+(b[lb]<<1)+_b[j]-'0';
29     }
30     if(!a[1] || !b[1]){  cout<<0<<endl;  return 0;}
31 
32 输出:
33 
34     cout<<c[lc];
35     for(int i=lc-1;i>=1;i--)  printf("%04d",c[i]);
36     cout<<endl;
37 
38 除单精:
39 void division(int z){
40     lc=la-(a[la]<z);
41     for(int i=la;i>=1;i--){
42         c[i]=a[i]/z;
43         a[i-1]+=(a[i]%z)*ss;
44     }
45     for(int i=1;i<=lc;i++)  c[i+1]+=c[i]/ss,c[i]%=ss;
46     while(c[lc+1])  lc++,c[lc+1]+=c[lc]/ss,c[lc]%=ss;
47 }
View Code

 筛欧拉函数:

 1 void shai(){
 2     memset(kang,0,sizeof(kang));
 3     phi[1]=1;
 4     for(int i=2;i<=n;i++){
 5         if(!kang[i]){  phi[i]=i-1;  zhi[++ztop]=i;}
 6         for(int j=1;j<=ztop && zhi[j]*i<=n;j++){
 7             kang[i*zhi[j]]=true;
 8             if(!(i%zhi[j])){  phi[i*zhi[j]]=phi[i]*zhi[j];  break;}
 9             phi[i*zhi[j]]=phi[i]*phi[zhi[j]];
10         }
11     }
12 }
View Code

 (小根)堆:

 1 int hheap[110000],size=0;
 2 void push(int x){
 3     hheap[size]=x;
 4     int current=size,father=(size-1)>>1;
 5     while(hheap[current]<hheap[father]){
 6         swap(hheap[current],hheap[father]);
 7         current=father,father=(current-1)>>1;
 8     }
 9     size++;
10 }
11 void updata(int x){
12     int lchild=(x<<1)+1,rchild=(x<<1)+2;
13     int min_id=x;
14     if(lchild<size && hheap[lchild]<hheap[min_id])  min_id=lchild;
15     if(rchild<size && hheap[rchild]<hheap[min_id])  min_id=rchild;
16     if(min_id!=x){
17         swap(hheap[x],hheap[min_id]);
18         updata(min_id);
19     }
20 }
21 void pop(){
22     swap(hheap[0],hheap[size-1]);
23     size--;
24     updata(0);
25 }
View Code

 tarjian:

 1 int dfn[110000],low[110000],dfs_cnt=0;
 2 bool visited[110000];
 3 int zhan[110000],top=0;
 4 int group[110000],group_cnt=0;
 5 bool is[110000];
 6 void tarjian(int x,int _father){
 7     visited[x]=true;
 8     dfn[x]=low[x]=++dfs_cnt;
 9     zhan[++top]=x;
10     for(int i=LINK[x];i;i=e[i].next){
11         if(!dfn[e[i].y]){
12             tarjian(e[i].y,x);
13             low[x]=min(low[x],low[e[i].y]);
14             if(low[e[i].y] >= dfn[x])  is[x]=true;
15         }
16         else if(visited[e[i].y])
17             low[x]=min(low[x],dfn[e[i].y]);
18     }
19     if(dfn[x]==low[x]){
20         group_cnt++;
21         int tmep;
22         do{
23             temp=zhan[top--];
24             group[temp]=group_cnt;
25             visited[temp]=false;
26         }while(temp!=x);
27     }
28 }
View Code

 费用流:

 1 int read(){int z=0,mark=1;  char ch=getchar();
 2     while(ch<'0'||ch>'9'){if(ch=='-')mark=-1;  ch=getchar();}
 3     while(ch>='0'&&ch<='9'){z=(z<<3)+(z<<1)+ch-'0';  ch=getchar();}
 4     return z*mark;
 5 }
 6 const int oo=168430090;
 7 struct ddd{int next,y,evalue,rev,cost;}e[1100000];  int LINK[510000];
 8 inline void insert(int x,int y,int z,int _cost){
 9     e[++ltop].next=LINK[x];LINK[x]=ltop;e[ltop].evalue=z;e[ltop].rev=ltop+1;e[ltop].cost=_cost;
10     e[++ltop].next=LINK[y];LINK[y]=ltop;e[ltop].evalue=0;e[ltop].rev=ltop-1;e[ltop].cost=-_cost;
11 }
12 int dist[510000];
13 int QUEUE[510000],head=0;  bool visited[510000];
14 int last[510000],last_e[510000];
15 bool spfa(){
16     memset(visited,0,sizeof(visited));
17     memset(dist,10,sizeof(dist));
18     QUEUE[head=1]=s;  dist[s]=0;
19     for(int k=1;k<=head;k++){
20         for(int i=LINK[QUEUE[k]];i;i=e[i].next)
21             if(e[i].evalue && dist[QUEUE[k]]+e[i].cost<dist[e[i].y]){
22                 dist[e[i].y]=dist[QUEUE[k]]+e[i].cost;
23                 last[e[i].y]=QUEUE[k],last_e[e[i].y]=i;
24                 if(!visited[e[i].y])  QUEUE[++head]=e[i].y,visited[e[i].y]=true;
25             }
26         visited[QUEUE[k]]=false;
27     }
28     return dist[t];
29 }
30 int cost_flow(){
31     int bowl=0;
32     while(spfa()){
33         int min_flow=oo;
34         for(int i=t;i!=s;i=last[i])  min_flow=min(min_flow,e[last_e[i]].evalue);
35         for(int i=t;i!=s;i=last[i]){
36             bowl+=min_flow*e[last_e[i]].cost;
37             e[last_e[i]].evalue-=min_flow,e[e[last_e[i]].rev].evalue+=min_flow;
38         }
39     }
40     return bowl;
41 }
View Code

高斯消元

 1 int gauss(){
 2     int now=1;
 3     for(int i=1;i<=n;i++){
 4         int temp=now;
 5         while(temp<=n && !(double_abs(a[temp][i])>eps))  temp++;
 6         if(temp>n)  continue;
 7         if(temp!=now)
 8             for(int j=1;j<=n+1;j++)  swap(a[temp][j],a[now][j]);
 9         double c=a[now][i];
10         for(int j=1;j<=n+1;j++)  a[now][j]/=c;
11         for(int j=1;j<=n;j++)if(j!=now){
12             c=a[j][i];
13             for(int k=1;k<=n+1;k++)
14                 a[j][k]-=c*a[now][k];
15         }
16         now++;
17     }
18 }
View Code

 树状数组+二维树状数组(结合这两个可以脑补出高维树状数组?):

 1 //===============一维==================
 2 
 3 int e[41000],lowbit[41000];
 4 void get_lowbit(){for(int i=1;i<=32001;++i)lowbit[i]=i&-i;}
 5 int query(int x){
 6     int bowl=0;
 7     while(x)  bowl+=e[x],x-=lowbit[x];
 8     return bowl;
 9 }
10 void modify(int x){while(x<=32001)  e[x]++,x+=lowbit[x];}
11 
12 //===============二维==================
13 
14 long long e[1100][1100];  int lowbit[1100];
15 void get_lowbit(){for(int i=1;i<=n;++i)lowbit[i]=i&-i;}
16 long long query(int x,int y){
17     if(x==0 || y==0)  return 0;
18     long long bowl=0;
19     for(int i=x;i;i-=lowbit[i])for(int j=y;j;j-=lowbit[j])  bowl+=e[i][j];
20     return bowl;
21 }
22 void modify(int x,int y,long long z){
23     for(int i=x;i<=n;i+=lowbit[i])for(int j=y;j<=n;j+=lowbit[j])  e[i][j]+=z;
24 }
View Code

 权值线段树套区间线段树,可以求动态区间第k大(这个代码求的区间第k大但是修改有点不一样,来自BZOJ3110):

 1 int n,m;  int N;
 2 struct dcd{int sleft,sright,mid,root;}tree[1700000];
 3 struct ddc{int mid,lchild,rchild,delta;  long long svalue;}tree_2[21000000];
 4 //数字个数最坏5e4*5e4会爆int
 5 int tree_cnt=0;
 6 int new_node(int x){
 7     tree_2[x].lchild=tree_2[x].rchild=tree_2[x].svalue=tree_2[x].delta=0;
 8     return x;
 9 }
10 void get_SegmentTree(int x,int _left,int _right){
11     tree[x].sleft=_left,tree[x].sright=_right,tree[x].mid=(_left+_right)>>1;
12     tree[x].root=new_node(++tree_cnt);
13     if(_left!=_right){
14         get_SegmentTree(x<<1,_left,tree[x].mid);
15         get_SegmentTree(x<<1|1,tree[x].mid+1,_right);
16     }
17 }
18 void push_down(int x,int uleft,int uright){
19     int umid=(uleft+uright)>>1;
20     if(!tree_2[x].lchild)  tree_2[x].lchild=new_node(++tree_cnt);
21     if(!tree_2[x].rchild)  tree_2[x].rchild=new_node(++tree_cnt);
22     //tree_2[tree_2[x].lchild].svalue+=(tree[x].mid-tree[x].sleft+1)*tree_2[x].delta;
23     //tree_2[tree_2[x].rchild].svalue+=(tree[x].sright-tree[x].mid)*tree_2[x].delta;
24     tree_2[tree_2[x].lchild].svalue+=(umid-uleft+1)*tree_2[x].delta;
25     tree_2[tree_2[x].rchild].svalue+=(uright-umid)*tree_2[x].delta;
26     tree_2[tree_2[x].lchild].delta+=tree_2[x].delta,tree_2[tree_2[x].rchild].delta+=tree_2[x].delta;
27     tree_2[x].delta=0;
28 }
29 void modify_2(int x,int _left,int _right,int uleft,int uright){
30     int umid=(uleft+uright)>>1;
31     if(uleft==_left && uright==_right){
32         tree_2[x].svalue+=uright-uleft+1,tree_2[x].delta++;
33         return ;
34     }
35     push_down(x,uleft,uright);
36     if(_left<=umid && _right>umid){
37         modify_2(tree_2[x].lchild,_left,umid,uleft,umid);
38         modify_2(tree_2[x].rchild,umid+1,_right,umid+1,uright);
39     }
40     else if(_right<=umid)  modify_2(tree_2[x].lchild,_left,_right,uleft,umid);
41     else  modify_2(tree_2[x].rchild,_left,_right,umid+1,uright);
42     tree_2[x].svalue=tree_2[tree_2[x].lchild].svalue+tree_2[tree_2[x].rchild].svalue;
43     //这句忘了QAQ
44     //if(tree_2[x].svalue<_value)  cout<<"fuck!!!"<<" "<<x<<endl;
45 }
46 void modify(int x,int y,int _left,int _right){
47     modify_2(tree[x].root,_left,_right,1,n);
48     if(tree[x].sleft==tree[x].sright)  return ;
49     if(y<=tree[x].mid)  modify(x<<1,y,_left,_right);
50     else  modify(x<<1|1,y,_left,_right);
51 }
52 long long query_2(int x,int _left,int _right,int uleft,int uright){
53     int umid=(uleft+uright)>>1;
54     if(uleft==_left && uright==_right)  return tree_2[x].svalue;
55     push_down(x,uleft,uright);
56     if(_left<=umid && _right>umid)
57         return query_2(tree_2[x].lchild,_left,umid,uleft,umid)+query_2(tree_2[x].rchild,umid+1,_right,umid+1,uright);
58     else if(_right<=umid)  return query_2(tree_2[x].lchild,_left,_right,uleft,umid);
59     else  return query_2(tree_2[x].rchild,_left,_right,umid+1,uright);
60 }
61 int query(int x,long long y,int _left,int _right){
62     if(tree[x].sleft==tree[x].sright)  return tree[x].sleft;
63     long long rchild_cnt=query_2(tree[x<<1|1].root,_left,_right,1,n);
64     if(y<=rchild_cnt)  query(x<<1|1,y,_left,_right);
65     else  query(x<<1,y-rchild_cnt,_left,_right);
66 }
View Code

 splay(来自模板题NOI2005维修序列):

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<algorithm>
  4 #include<cstring>
  5 #include<cmath>
  6 #include<queue>
  7 using namespace std;
  8 int read(){int z=0,mark=1;  char ch=getchar();
  9     while(ch<'0'||ch>'9'){if(ch=='-')mark=-1;  ch=getchar();}
 10     while(ch>='0'&&ch<='9'){z=(z<<3)+(z<<1)+ch-'0';  ch=getchar();}
 11     return z*mark;
 12 }
 13 const int oo=168430090;
 14 #define N 1100000
 15 int n,m,a[N],id[N],cnt=0;
 16 int fa[N],c[N][2],sum[N],size[N],v[N],mx[N],lx[N],rx[N];
 17 bool tag[N],rev[N];  int root;
 18 queue<int> q;
 19 void updata(int x){
 20     int l=c[x][0],r=c[x][1];
 21     sum[x]=sum[l]+sum[r]+v[x];
 22     size[x]=size[l]+size[r]+1;
 23     mx[x]=max(max(mx[l],mx[r]),rx[l]+v[x]+lx[r]);
 24     lx[x]=max(lx[l],sum[l]+v[x]+lx[r]);
 25     rx[x]=max(rx[r],sum[r]+v[x]+rx[l]);
 26 }
 27 void push_down(int x){
 28     int l=c[x][0],r=c[x][1];
 29     if(tag[x]){
 30         rev[x]=tag[x]=0;
 31         if(l)  tag[l]=1,v[l]=v[x],sum[l]=v[x]*size[l];
 32         if(r)  tag[r]=1,v[r]=v[x],sum[r]=v[x]*size[r];
 33         if(v[x]>=0){
 34             if(l)  lx[l]=rx[l]=mx[l]=sum[l];
 35             if(r)  lx[r]=rx[r]=mx[r]=sum[r];
 36         }
 37         else{
 38             if(l)  lx[l]=rx[l]=0,mx[l]=v[x];
 39             if(r)  lx[r]=rx[r]=0,mx[r]=v[x];
 40         }
 41     }
 42     if(rev[x]){
 43         rev[x]=0,rev[l]^=1,rev[r]^=1;
 44         swap(lx[l],rx[l]),swap(lx[r],rx[r]);
 45         swap(c[l][0],c[l][1]),swap(c[r][0],c[r][1]);
 46     }
 47 }
 48 void rotate(int x,int &goal){
 49     int y=fa[x],z=fa[y],l,r;
 50     l=(c[y][1]==x);  r=l^1;
 51     if(y==goal)  goal=x;
 52     else  c[z][c[z][1]==y]=x;
 53     fa[c[x][r]]=y,fa[y]=x,fa[x]=z;
 54     c[y][l]=c[x][r],c[x][r]=y;
 55     updata(y),updata(x);
 56 }
 57 void splay(int x,int &goal){
 58     int y,z;
 59     while(x!=goal){
 60         y=fa[x],z=fa[y];
 61         if(y!=goal)  rotate(c[y][0]==x^c[z][0]==y?x:y,goal);
 62         rotate(x,goal);
 63     }
 64 }
 65 int search(int x,int y){    
 66     push_down(x);  int l=c[x][0],r=c[x][1];
 67     while(size[l]+1!=y){
 68         if(y<=size[l])  x=l;
 69         else  y-=size[l]+1,x=r;
 70         push_down(x);  l=c[x][0],r=c[x][1];
 71     }
 72     return x;
 73 }
 74 void rec(int x){
 75     if(!x)  return ;
 76     int l=c[x][0],r=c[x][1];
 77     rec(l),rec(r);  q.push(x);
 78     fa[x]=c[x][0]=c[x][1]=0;
 79     tag[x]=rev[x]=0;
 80 }
 81 int split(int k,int tot){
 82     int x=search(root,k),y=search(root,k+tot+1);
 83     splay(x,root),splay(y,c[x][1]);
 84     return c[y][0];
 85 }
 86 int query(int x,int tot){  return sum[split(x,tot)];}
 87 void modify(int k,int tot,int val){
 88     int x=split(k,tot),y=fa[x];
 89     v[x]=val,tag[x]=1,sum[x]=size[x]*val;
 90     if(val>=0)  lx[x]=rx[x]=mx[x]=sum[x];
 91     else  lx[x]=rx[x]=0,mx[x]=val;
 92     updata(y),updata(fa[y]);
 93 }
 94 void rever(int k,int tot){
 95     int x=split(k,tot),y=fa[x];
 96     if(!tag[x]){
 97         rev[x]^=1;
 98         swap(c[x][0],c[x][1]);
 99         swap(lx[x],rx[x]);
100         updata(y),updata(fa[y]);
101     }
102 }
103 void erase(int k,int tot){
104     int x=split(k,tot),y=fa[x];
105     rec(x);  c[y][0]=0;
106     updata(y),updata(fa[y]);
107 }
108 void build(int l,int r,int f){
109     if(l>r)  return ;
110     int mid=(l+r)>>1,now=id[mid],last=id[f];
111     if(l!=r)  build(l,mid-1,mid),build(mid+1,r,mid);
112     v[now]=a[mid],fa[now]=last,updata(now);
113     c[last][mid>=f]=now;
114 }
115 void insert(int k,int tot){
116     for(int i=1;i<=tot;++i)  a[i]=read();
117     for(int i=1;i<=tot;++i){
118         if(!q.empty())  id[i]=q.front(),q.pop();
119         else  id[i]=++cnt;
120     }
121     build(1,tot,0);  int z=id[(1+tot)>>1];
122     int x=search(root,k+1),y=search(root,k+2);
123     splay(x,root),splay(y,c[x][1]);
124     fa[z]=y,c[y][0]=z;
125     updata(y),updata(x);
126 }
127 int main(){//freopen("ddd.in","r",stdin);
128     cin>>n>>m;
129     mx[0]=a[1]=a[n+2]=-oo;
130     for(int i=1;i<=n;++i)  a[i+1]=read();
131     for(int i=1;i<=n+2;++i)  id[i]=i;
132     build(1,n+2,0);
133     root=(n+3)>>1,cnt=n+2;
134     int x,tot,val;
135     char ch[10];
136     while(m -->0){//趋向于
137         scanf("%s",ch);
138         if(ch[0]!='M'||ch[2]!='X')  x=read(),tot=read();
139         if(ch[0]=='I')  insert(x,tot);
140         if(ch[0]=='D')  erase(x,tot);
141         if(ch[0]=='M'){
142             if(ch[2]=='X')  printf("%d\n",mx[root]);
143             else  val=read(),modify(x,tot,val);
144         }
145         if(ch[0]=='R')  rever(x,tot);
146         if(ch[0]=='G')  printf("%d\n",query(x,tot));
147     }
148     return 0;
149 }
View Code

 倍增lca:

 1 void dfs(int x){
 2     dfs_order[++order_cnt]=x;
 3     for(int i=1;(1<<i)<=deep[x];++i)  ancestor[x][i]=ancestor[ancestor[x][i-1]][i-1];
 4     for(int i=LINK[x];i;i=e[i].next)if(e[i].y!=ancestor[x][0]){
 5         ancestor[e[i].y][0]=x;  deep[e[i].y]=deep[x]+1;
 6         //roots[e[i].y]=modify(roots[x],binary_search(a[e[i].y]));
 7         dfs(e[i].y);
 8     }
 9 }
10 int lca(int x,int y){
11     if(deep[x]<deep[y])  swap(x,y);
12     int _deep=deep[x]-deep[y];
13     for(int i=0;i<=16;++i)if((1<<i)&_deep)  x=ancestor[x][i];
14     for(int i=16;i>=0;--i)if(ancestor[x][i]!=ancestor[y][i])
15         x=ancestor[x][i],y=ancestor[y][i];
16     if(x==y)  return x;
17     else return ancestor[x][0];
18 }
View Code

 lct:

 1 int fa[11000],c[11000][2],st[11000],delta[11000];
 2 bool is_root(int x){return c[fa[x]][0]!=x&&c[fa[x]][1]!=x;}
 3 void push_down(int x){
 4     int l=c[x][0],r=c[x][1];
 5     if(delta[x]){
 6         delta[x]=0,delta[l]^=1,delta[r]^=1;
 7         swap(c[x][0],c[x][1]);
 8     }
 9 }
10 void rotate(int x){
11     int y=fa[x],z=fa[y],l,r;
12     l=(c[y][1]==x);  r=l^1;
13     if(!is_root(y))  c[z][c[z][1]==y]=x;
14     fa[x]=z,fa[y]=x,fa[c[x][r]]=y;
15     c[y][l]=c[x][r],c[x][r]=y;
16 }
17 void splay(int x){
18     int top=0;  st[++top]=x;
19     for(int i=x;!is_root(i);i=fa[i])  st[++top]=fa[i];
20     for(int i=top;i;--i)  push_down(st[i]);
21     int y,z;
22     while(!is_root(x)){
23         y=fa[x],z=fa[y];
24         if(!is_root(y))  rotate(c[y][0]==x^c[z][0]==y?x:y);
25         rotate(x);
26     }
27 }
28 void access(int x){
29     int last=0;
30     while(x){
31         splay(x);
32         c[x][1]=last;
33         last=x,x=fa[x];
34     }
35 }
36 void rever(int x){  access(x),splay(x),delta[x]^=1;}
37 void connect(int x,int y){  rever(x),fa[x]=y,splay(x);}
38 void cut(int x,int y){
39     rever(x),access(y),splay(y),c[y][0]=fa[x]=0;
40 }
41 int search(int x){
42     access(x),splay(x);
43     while(c[x][0])  x=c[x][0];
44     return x;
45 }
View Code

 自己优化的sbt:

 1 int c[210000][2],sz[210000],v[210000],tot=1,root=1;
 2 void rotate(int &x,bool mk){  if(!x)  return ;
 3     int y=c[x][mk^1],l=mk,r=mk^1;
 4     c[x][r]=c[y][l];  c[y][l]=x;
 5     sz[y]=sz[x];  sz[x]=sz[c[x][l]]+sz[c[x][r]]+1;
 6     x=y;
 7 }
 8 void mt(int &x,bool mk){  if(!x)  return ;
 9     int l=mk,r=mk^1;
10     if(sz[c[c[x][l]][l]]>sz[c[x][r]])  rotate(x,mk^1);
11     else if(sz[c[c[x][l]][r]]>sz[c[x][r]])
12         rotate(c[x][l],mk),rotate(x,mk^1);
13     else return ;
14     mt(c[x][l],mk),mt(c[x][r],mk^1);
15     mt(x,true),mt(x,false);
16 }
17 void ist(int &x,int y){    
18     if(!x){  x=++tot;  c[x][0]=c[x][1]=0,sz[x]=1,v[x]=y;}
19     else  sz[x]++,ist(c[x][y>v[x]],y),mt(x,y>v[x]);
20 }
21 void rmv(int &x,int y){  if(!x)  return ;
22     --sz[x];
23     if(y!=v[x])  rmv(c[x][y>v[x]],y);
24     else if(!c[x][0] && !c[x][1])  x=0;
25     else if(!(c[x][0]*c[x][1]))  x=c[x][0]+c[x][1];
26     else{
27         int tmp=c[x][1];
28         while(c[tmp][0])  tmp=c[tmp][0];
29         v[x]=v[tmp];  rmv(c[x][1],v[tmp]);
30     }
31 }
32 int sch(int x,int y){
33     while(y!=sz[c[x][1]]+1){  if(x<1)  return 0;
34         if(y<=sz[c[x][1]])  x=c[x][1];
35         else  y-=sz[c[x][1]]+1,x=c[x][0];
36     }
37     return x;
38 }
39 int fd(int x,int y){while(v[x]!=y)x=c[x][y>v[x]];  return x;}
View Code

 后缀数组(注意height下标从1开始(因为rank从1开始)):

 1 int n;  char s[1100000];
 2 int rk[1100000],hght[1100000];
 3 int cnt[220],cntrk[1100000];
 4 int rk1[1100000],rk2[1100000];
 5 int sa[1100000],tmpsa[1100000];
 6 int ans[1100000];
 7 void gtsffxrk(){
 8     memset(cnt,0,sizeof(cnt));
 9     for(int i=0;i<n;++i)  ++cnt[s[i]];
10     for(int i=1;i<=210;++i)  cnt[i]+=cnt[i-1];
11     for(int i=0;i<n;++i)  rk[i]=cnt[s[i]]-1;
12     for(int l=1;l<n;l<<=1){
13         for(int i=0;i<n;++i)  rk1[i]=rk[i],rk2[i]=(i+l<n)?rk[i+l]:0;
14         //memset(cntrk,0,sizeof(cntrk));
15         fill(cntrk,cntrk+n,0);
16         for(int i=0;i<n;++i)  ++cntrk[rk2[i]];
17         for(int i=1;i<n;++i)  cntrk[i]+=cntrk[i-1];
18         for(int i=n-1;i>=0;--i)  tmpsa[--cntrk[rk2[i]]]=i;
19         //memset(cntrk,0,sizeof(cntrk));
20         fill(cntrk,cntrk+n,0);
21         for(int i=0;i<n;++i)  ++cntrk[rk1[i]];
22         for(int i=1;i<n;++i)  cntrk[i]+=cntrk[i-1];
23         for(int i=n-1;i>=0;--i)  sa[--cntrk[rk1[tmpsa[i]]]]=tmpsa[i];
24         rk[sa[0]]=0;
25         bool flg=true;
26         for(int i=1;i<n;++i){
27             rk[sa[i]]=rk[sa[i-1]];
28             rk[sa[i]]+=(rk1[sa[i]]!=rk1[sa[i-1]] || rk2[sa[i]]!=rk2[sa[i-1]]);
29             if(rk1[sa[i]]==rk1[sa[i-1]] || rk2[sa[i]]==rk2[sa[i-1]])  flg=false;
30         }
31         if(flg)  break;
32     }
33 }
34 void gthght(){
35     int l=0;
36     for(int i=0;i<n;++i)if(rk[i]){
37         int j=sa[rk[i]-1];
38         while(i+l<n && j+l<n && s[i+l]==s[j+l])  ++l;
39         hght[rk[i]]=l;
40         l-=(l>0);
41     }
42 }
View Code

 莫比乌斯函数:

 1 int prm[51000],ptt=0;
 2 bool flg[51000];
 3 int miu[51000];
 4 void slct(){
 5     memset(flg,0,sizeof(flg));
 6     miu[1]=1;
 7     for(int i=2;i<=50000;++i){
 8         if(!flg[i])  prm[++ptt]=i,miu[i]=-1;
 9         for(int j=1;prm[j]*i<=50000;++j){
10             flg[prm[j]*i]=true;
11             if(!(i%prm[j])){  miu[i*prm[j]]=0;  break;}
12             miu[prm[j]*i]=-miu[i];
13         }
14     }
15 }
View Code

 FFT求高精度乘:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cmath>
 6 using namespace std;
 7 const int nn=310000;
 8 struct cp{
 9     double r,i;
10     cp(double _r=0,double _i=0):  r(_r),i(_i){}
11     cp operator+(cp x){return cp(r+x.r,i+x.i);}
12     cp operator-(cp x){return cp(r-x.r,i-x.i);}
13     cp operator*(cp x){return cp(r*x.r-i*x.i,r*x.i+i*x.r);}
14 };
15 cp a[nn],b[nn],tmp[nn],_x,_y,c[nn];
16 char s1[nn],s2[nn];
17 int ans[nn],a1[nn],a2[nn],dig[nn];
18 int rvs[nn],N,L;
19 void fft(cp x[],int mk){
20     for(int i=0;i<N;++i)  tmp[i]=x[rvs[i]];
21     for(int i=0;i<N;++i)  x[i]=tmp[i];
22     for(int i=2;i<=N;i<<=1){
23         cp wn(cos(2*M_PI/i),mk*sin(2*M_PI/i));
24         for(int k=0;k<N;k+=i){
25             cp w(1,0);
26             for(int j=k;j<k+i/2;++j){
27                 _x=x[j];  _y=x[j+i/2]*w;
28                 x[j]=_x+_y;  x[j+i/2]=_x-_y;
29                 w=w*wn;
30             }
31         }
32     }
33     if(mk==-1)  for(int i=0;i<N;++i)  x[i].r/=N;
34 }
35 int main(){//freopen("ddd.in","r",stdin);
36     scanf("%s%s",&s1,&s2);
37     int l1=strlen(s1),l2=strlen(s2);
38     for(N=1,L=0;N<max(l1,l2);N<<=1,++L);  N<<=1,++L;
39     for(int i=0;i<N;++i){
40         int l=0;
41         for(int j=i;j;j>>=1)  dig[l++]=j&1;
42         for(int j=0;j<L;++j)  rvs[i]=(rvs[i]<<1)|dig[j];
43     }
44     for(int i=0;i<l1;++i)  a1[l1-i-1]=s1[i]-'0';
45     for(int i=0;i<l2;++i)  a2[l2-i-1]=s2[i]-'0';
46     for(int i=0;i<N;++i)  a[i]=cp(a1[i]);
47     for(int i=0;i<N;++i)  b[i]=cp(a2[i]);
48     fft(a,1),fft(b,1);
49     for(int i=0;i<N;++i)  c[i]=a[i]*b[i];
50     fft(c,-1);
51     for(int i=0;i<N;++i)  ans[i]=int(c[i].r+0.5);
52     for(int i=0;i<N;++i)  ans[i+1]+=ans[i]/10,ans[i]%=10;
53     int l=l1+l2-1;
54     while(ans[l]==0 && l>0)  --l;
55     for(int i=l;i>=0;--i)  printf("%d",ans[i]);
56     cout<<endl;
57     return 0;
58 }
View Code

 马拉车:

1     for(int i=0;i<n;++i)  ss[i<<1]='#',ss[i<<1|1]=s[i];
2     nn=n<<1;  ss[nn]='#';
3     int mx=0,id=0,ans=0;
4     for(int i=0;i<=nn;++i){
5         f[i]=(mx>i) ? min(f[2*id-i],mx-i) : 1;
6         while(i>=f[i] && i+f[i]<=nn && ss[i+f[i]]==ss[i-f[i]])  ++f[i];
7         if(mx<i+f[i]-1)  mx=i+f[i]-1,id=i;
8         ans=max(ans,f[i]-(s[i]!='#'));
9     }
View Code

 exgcd:

 1 int exgcd(int a,int b,int &x,int &y){
 2     if(!b){  x=1,y=0;  return a;}
 3     int d=exgcd(b,a%b,x,y);
 4     int c=x;  x=y,y=c-a/b*y;
 5     return d;
 6 }
 7 
 8 int d=exgcd(a,b,x,y);
 9 x=x*c/d,d=b/d;
10 x=(x%d+d)%d;
View Code

 更成熟的fft求多项式乘(其实没啥区别:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cmath>
 6 using namespace std;
 7 int rd(){int z=0,mk=1;  char ch=getchar();
 8     while(ch<'0'||ch>'9'){if(ch=='-')mk=-1;  ch=getchar();}
 9     while(ch>='0'&&ch<='9'){z=(z<<3)+(z<<1)+ch-'0';  ch=getchar();}
10     return z*mk;
11 }
12 void wt(int x,char y){
13     if(!x){  putchar('0');  return ;}
14     if(x<0)  putchar('-'),x=-x;
15     int wtp=0,wtc[32];
16     while(x)  wtc[++wtp]=x%10+'0',x/=10;
17     while(wtp)  putchar(wtc[wtp--]);
18     putchar(y);
19 }
20 struct cp{
21     double r,i;
22     cp(double _r=0,double _i=0):  r(_r),i(_i){}
23     cp operator+(cp x){return cp(r+x.r,i+x.i);}
24     cp operator-(cp x){return cp(r-x.r,i-x.i);}
25     cp operator*(cp x){return cp(r*x.r-i*x.i,r*x.i+i*x.r);}
26 };
27 int n,m;
28 cp a[410000],b[410000],tmp[410000],_x,_y,c[410000];
29 int rvs[410000],dg[32],N,L;
30 void fft(cp x[],int mk){
31     for(int i=0;i<N;++i)  tmp[i]=x[rvs[i]];
32     for(int i=0;i<N;++i)  x[i]=tmp[i];
33     for(int i=2;i<=N;i<<=1){
34     cp wn(cos(2*M_PI/i),mk*sin(2*M_PI/i));
35     for(int k=0;k<N;k+=i){
36         cp w(1,0);
37         for(int j=k;j<k+(i>>1);++j){
38         _x=x[j],_y=x[j+(i>>1)]*w;
39         x[j]=_x+_y,x[j+(i>>1)]=_x-_y;
40         w=w*wn;
41         }
42     }
43     }
44     if(mk==-1)  for(int i=0;i<N;++i)  x[i].r/=N;
45 }
46 int main(){freopen("ddd.in","r",stdin);
47     cin>>n>>m;
48     for(int i=0;i<=n;++i)  a[i]=cp(rd());
49     for(int i=0;i<=m;++i)  b[i]=cp(rd());
50     for(N=1,L=0;N<=max(n+1,m+1);N<<=1,++L);  N<<=1,++L;
51     for(int i=0;i<N;++i){
52     for(int j=i,k=0;j;j>>=1,++k)  dg[k]=j&1;
53     for(int j=0;j<L;++j)  rvs[i]=(rvs[i]<<1)|dg[j];
54     }
55     fft(a,1),fft(b,1);
56     for(int i=0;i<N;++i)  c[i]=a[i]*b[i];
57     fft(c,-1);
58     for(int i=0;i<=n+m;++i)  printf("%d ",(int)(c[i].r+0.5));
59     cout<<endl;
60     return 0;
61 }
View Code

 ntt求多项式乘:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cmath>
 6 using namespace std;
 7 #define ll long long
 8 const ll mo=998244353;
 9 ll rd(){ll z=0,mk=1; char ch=getchar();
10     while(ch<'0'||ch>'9'){if(ch=='-')mk=-1;  ch=getchar();}
11     while(ch>='0'&&ch<='9'){z=(z<<3)+(z<<1)+ch-'0';  ch=getchar();}
12     return z*mk;
13 }
14 ll qcp(ll x,int y){
15     ll bs=x,z=1;
16     for(;y;y>>=1){
17         if(y&1)  z=(z*bs)%mo;
18         bs=(bs*bs)%mo;
19     }
20     return z;
21 }
22 int n,m;
23 ll a[410000],b[410000],tmp[410000],_x,_y,c[410000];
24 int rvs[410000],dg[32],N,L;  ll _1_N;
25 void ntt(ll x[],int mk){
26     for(int i=0;i<N;++i)if(i<rvs[i])  swap(x[i],x[rvs[i]]);
27     for(int i=2;i<=N;i<<=1){
28         ll wn=qcp(3,(mk*((mo-1)/i))%(mo-1));
29         for(int k=0;k<N;k+=i){
30             ll w=1;
31             for(int j=k;j<k+(i>>1);++j){
32                 _x=x[j],_y=(x[j+(i>>1)]*w)%mo;
33                 x[j]=(_x+_y)%mo,x[j+(i>>1)]=(_x-_y+mo)%mo;
34                 w=(w*wn)%mo;
35             }
36         }
37     }
38     if(mk==mo-2)  for(int i=0;i<N;++i)  x[i]=(x[i]*_1_N)%mo;
39 }
40 int main(){//freopen("ddd.in","r",stdin);
41     cin>>n>>m;
42     for(int i=0;i<n;++i)  a[i]=rd();
43     for(int i=0;i<m;++i)  b[i]=rd();
44     for(N=1,L=0;N<=max(n,m);N<<=1,++L);  N<<=1,++L;
45     _1_N=qcp(N,mo-2);
46     for(int i=0;i<N;++i){
47         for(int j=i,k=0;j;j>>=1,++k)  dg[k]=j&1;
48         for(int j=0;j<L;++j)  rvs[i]=(rvs[i]<<1)|dg[j];
49     }
50     ntt(a,1),ntt(b,1);
51     for(int i=0;i<N;++i)  c[i]=a[i]*b[i];
52     ntt(c,mo-2);
53     for(int i=0;i<=n+m-2;++i)  printf("%lld ",c[i]);
54     cout<<endl;
55     return 0;
56 }
View Code

 中国剩余定理:

1     ll M=m[1],A=a[1],k,y;
2     for(int i=2;i<=n;++i){
3         ll tmp=a[i]-A,d;
4         d=exgcd(M,m[i],k,y);
5         if(tmp%d)  return -1;
6         ll tm=m[i]/d;
7         k=(k*tmp/d%tm+tm)%tm,A+=k*M,M=M*m[i]/d,A=(A+M)%M;
8     }
9     return A;
View Code

 

posted on 2016-11-08 16:48  cdcq_old  阅读(1255)  评论(0编辑  收藏  举报