• 模板重搭建計劃


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

    一定程度上减少被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:WindowsSystem32
     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
    ",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
    ",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
  • 相关阅读:
    STL--set_difference
    priority_queue和sort应用
    16进制转化8进制---map
    LeetCode62. 不同路径
    LeetCode209. 长度最小的子数组
    LeetCode第29场双周赛题解
    LeetCode61. 旋转链表
    LeetCode60. 第k个排列
    LeetCode59. 螺旋矩阵 II
    LeetCode58. 最后一个单词的长度
  • 原文地址:https://www.cnblogs.com/JSL2018/p/6043644.html
Copyright © 2020-2023  润新知