首页 > 技术文章 > 模板库

zhuohan123 2013-11-07 21:12 原文

呼,终于在考试之前复习了一遍所有模板。

球NOIP不跪!

BigNumber

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <string>
  4 #include <cstring>
  5 #include <algorithm>
  6 using namespace std;
  7 const int maxlen=3100;
  8 struct bigint
  9 {
 10     int a[maxlen],len;
 11     bigint()
 12     {
 13         memset(a,0,sizeof a);
 14         len=1;
 15     }
 16     bigint(string str)
 17     {
 18         memset(a,0,sizeof a);
 19         len=str.length();
 20         for(int i=1;i<=len;i++)a[i]=str[len-i]-'0';
 21     }
 22     bigint(int num)
 23     {
 24         memset(a,0,sizeof a);
 25         len=0;
 26         if(num==0)len++;
 27         else while(num)a[++len]=num%10,num/=10;
 28     }
 29     string tostring()
 30     {
 31         string str;
 32         for(int i=len;i;i--)str+=char(a[i]+'0');
 33         return str;
 34     }
 35     inline int& operator[](int num){return a[num];}
 36     friend bool operator<(bigint& a,bigint& b)
 37     {
 38         if(a.len>b.len)return false;
 39         if(a.len<b.len)return true;
 40         for(int i=a.len;i;i--)
 41         {
 42             if(a[i]>b[i])return false;
 43             if(a[i]<b[i])return true;
 44         }
 45         return false;
 46     }
 47     friend bool operator>(bigint& a,bigint& b){return b<a;}
 48     friend bool operator==(bigint& a,bigint& b)
 49     {
 50         if(a.len!=b.len)return false;
 51         for(int i=1;i<=a.len;i++)if(a[i]!=b[i])return false;
 52         return true;
 53     }
 54     friend bool operator>=(bigint& a,bigint& b){return !(a<b);}
 55     friend bool operator<=(bigint& a,bigint& b){return !(a>b);}
 56     friend bigint operator+(bigint& a,bigint& b)
 57     {
 58         bigint c;c.len=max(a.len,b.len);
 59         for(int i=1;i<=c.len;i++)c[i]=a[i]+b[i];
 60         for(int i=1;i<=c.len;i++)
 61             if(c[i]>=10)c[i]-=10,c[i+1]++;
 62         while(c[c.len+1])
 63         {
 64             c.len++;
 65             if(c[c.len]>=10)c[c.len]-=10,c[c.len+1]++;
 66         }
 67         return c;
 68     }
 69     friend bigint& operator+=(bigint& a,bigint& b){return a=a+b;}
 70     friend bigint operator-(bigint& a,bigint& b)
 71     {
 72         bigint c;c.len=a.len;
 73         for(int i=1;i<=c.len;i++)c[i]=a[i]-b[i];
 74         for(int i=1;i<=c.len;i++)
 75             if(c[i]<0)c[i]+=10,c[i+1]--;
 76         while(c.len&&!c[c.len])c.len--;
 77         if(!c.len)c.len=1;
 78         return c;
 79     }
 80     friend bigint& operator-=(bigint& a,bigint& b){return a=a-b;}
 81     friend bigint operator*(bigint& a,int b)
 82     {
 83         bigint c;c.len=a.len;
 84         for(int i=1;i<=c.len;i++)c[i]=a[i]*b;
 85         for(int i=1;i<=c.len;i++)c[i+1]+=c[i]/10,c[i]%=10;
 86         while(c[c.len+1])c.len++,c[c.len+1]+=c[c.len]/10,c[c.len]%=10;
 87         return c;
 88     }
 89     friend bigint operator*(int b,bigint& a){return a*b;}
 90     friend bigint operator*=(bigint& a,int b){a=a*b;return a;}
 91     friend bigint operator*(bigint a,bigint b)
 92     {
 93         bigint c;c.len=a.len+b.len-1;
 94         for(int i=1;i<=a.len;i++)
 95             for(int j=1;j<=b.len;j++)
 96             c[i+j-1]+=a[i]*b[j];
 97         for(int i=1;i<=c.len;i++)c[i+1]+=c[i]/10,c[i]%=10;
 98         while(c[c.len+1])c.len++,c[c.len+1]+=c[c.len]/10,c[c.len]%=10;
 99         return c;
100     }
101     friend bigint operator*=(bigint& a,bigint b){a=a*b;return a;}
102     friend bigint operator/(bigint& a,int b)
103     {
104         bigint c;c.len=a.len;
105         int d=0;
106         for(int i=a.len;i;i--)d=d*10+a[i],c[i]+=d/b,d%=b;
107         while(c.len&&!c[c.len])c.len--;
108         if(!c.len)c.len=1;
109         return c;
110     }
111     friend int operator%(bigint& a,int b)
112     {
113         int d=0;
114         for(int i=a.len;i;i--)d=(d*10+a[i])%b;
115         return d;
116     }
117     friend bigint operator/(bigint& a,bigint& b)
118     {
119         bigint c,d;c.len=a.len;
120         for(int i=a.len;i;i--)
121         {
122             d*=10;d[1]+=a[i];
123             while(d>=b)d-=b,c[i]++;
124         }
125         while(c.len&&!c[c.len])c.len--;
126         if(!c.len)c.len=1;
127         return c;
128     }
129     friend bigint operator%(bigint& a,bigint& b)
130     {
131         bigint d;
132         for(int i=a.len;i;i--)
133         {
134             d*=10;d[1]+=a[i];
135             while(d>=b)d-=b;
136         }
137         return d;
138     }
139     
140 };
141 void div(bigint& a,int b,bigint& p,int &c)
142 {
143     memset(p.a,0,sizeof p.a);p.len=a.len;c=0;
144     for(int i=a.len;i;i--)
145     {
146         c=c*10+a[i];
147         p[i]+=c/b;
148         c%=b;
149     }
150     while(p.len&&!p[p.len])p.len--;
151     if(!p.len)p.len=1;
152 }
153 bigint gcd(bigint a,bigint b)
154 {
155     while(!(b.len==1&&b[1]==0))a=a%b,swap(a,b);
156     return a;
157 }
158 int main(int argc, char *argv[])
159 {
160     
161     return 0;
162 }

SuffixArray

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <string>
 4 #include <cstring>
 5 #include <algorithm>
 6 using namespace std;
 7 const int maxlen=310000;
 8 inline int change(char ch){return ch-'a';}
 9 int rank[maxlen],sa[maxlen];
10 int trank[maxlen],tsa[maxlen];
11 int isort[maxlen];
12 int height[maxlen];
13 void suffix_array(string str)
14 {
15     int len=str.length();str="&"+str;
16     for(int i=1;i<=len;i++)isort[change(str[i])]++;
17     for(int i=change('a')+1;i<=change('z');i++)isort[i]+=isort[i-1];
18     for(int i=len;i;i--)sa[isort[change(str[i])]--]=i;
19     for(int i=1;i<=len;i++)rank[sa[i]]=rank[sa[i-1]]+(str[sa[i]]!=str[sa[i-1]]);
20     for(int o=1;o<=2*len;o*=2)
21     {
22         for(int i=1;i<=len;i++)isort[i]=0;
23         for(int i=1;i<=len;i++)isort[rank[i+o]]++;
24         for(int i=1;i<=len;i++)isort[i]+=isort[i-1];
25         for(int i=len;i;i--)tsa[isort[rank[i+o]]--]=i;
26         for(int i=1;i<=len;i++)isort[i]=0;
27         for(int i=1;i<=len;i++)isort[rank[i]]++;
28         for(int i=1;i<=len;i++)isort[i]+=isort[i-1];
29         for(int i=len;i;i--)sa[isort[rank[tsa[i]]]--]=tsa[i];
30         for(int i=1;i<=len;i++)trank[sa[i]]=trank[sa[i-1]]
31                 +(rank[sa[i]]>rank[sa[i-1]]||rank[sa[i]+o]>rank[sa[i-1]+o]);
32         for(int i=1;i<=len;i++)rank[i]=trank[i];
33     }
34     for(int i=1;i<=len;i++)
35         if(rank[i]!=len)
36         {
37             while(str[i+height[rank[i]]]==str[sa[rank[i]+1]+height[rank[i]]])height[rank[i]]++;
38             height[rank[i+1]]=max(height[rank[i]]-1,0);
39         }
40 }
41 int main(int argc, char *argv[])
42 {
43     
44     return 0;
45 }

Aho-Corasick automaton

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <string>
 5 #include <algorithm>
 6 using namespace std;
 7 inline int change(char ch)
 8 {
 9     if(ch=='A')return 0;
10     if(ch=='T')return 1;
11     if(ch=='G')return 2;
12     if(ch=='C')return 3;
13 }
14 struct node{int s[4],fail;bool isend;}t[2100];int tnum;
15 void add(string str)
16 {
17     int now=0;
18     for(int i=0;i<str.length();i++)
19     {
20         if(!t[now].s[change(str[i])])
21             t[now].s[change(str[i])]=++tnum;
22         now=t[now].s[change(str[i])];
23     }
24     t[now].isend=true;
25 }
26 int q[2100],l,r;
27 void getfail()
28 {
29     l=1;r=0;
30     for(int i=0;i<4;i++)
31         if(t[0].s[i])q[++r]=t[0].s[i];
32     while(l<=r)
33         for(int now=q[l++],i=0;i<4;i++)
34         if(t[now].s[i])
35         {
36             t[t[now].s[i]].fail=t[now].fail;
37             while(t[t[now].s[i]].fail&&!t[t[t[now].s[i]].fail].s[i])
38                 t[t[now].s[i]].fail=t[t[t[now].s[i]].fail].fail;
39             t[t[now].s[i]].fail=t[t[t[now].s[i]].fail].s[i];
40             t[t[now].s[i]].isend|=t[t[t[now].s[i]].fail].isend;
41             q[++r]=t[now].s[i];
42         }
43 }
44 int main(int argc, char *argv[])
45 {
46     
47     return 0;
48 }

Dinic

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 using namespace std;
 6 const int maxpoint=110000,maxedge=1100000,inf=2147483647;
 7 int head[maxpoint],nowhead[maxpoint],pointsize;
 8 struct edge{int to,next,c;}g[maxedge];int gnum=1;
 9 void addedge(int from,int to,int c)
10 {
11     g[++gnum].to=to;g[gnum].c=c;g[gnum].next=head[from];head[from]=gnum;
12     g[++gnum].to=from;g[gnum].c=0;g[gnum].next=head[to];head[to]=gnum;
13 }
14 int dfsstart,dfsend;
15 int d[maxpoint];
16 int q[maxpoint],ql,qr;
17 bool BFS()
18 {
19     for(int i=1;i<=pointsize;i++)d[i]=0,nowhead[i]=head[i];
20     q[ql=qr=1]=dfsend;
21     while(ql<=qr)
22         for(int now=q[ql++],i=head[now];i;i=g[i].next)
23             if(g[i^1].c&&g[i].to!=dfsend&&!d[g[i].to])
24                 d[q[++qr]=g[i].to]=d[now]+1;
25     return d[dfsstart];
26 }
27 int DFS(int po,int delta)
28 {
29     if(po==dfsend)return delta;
30     int nowans=0,t;
31     for(int&i=nowhead[po];i&&delta;i=g[i].next)
32         if(g[i].c&&d[g[i].to]+1==d[po]&&(t=DFS(g[i].to,min(delta,g[i].c))))
33             g[i].c-=t,g[i^1].c+=t,delta-=t,nowans+=t;
34     return nowans;
35 }
36 int dinic(int start,int end)
37 {
38     dfsstart=start,dfsend=end;
39     int ans=0;
40     while(BFS())ans+=DFS(start,inf);
41     return ans;
42 }
43 int main(int argc, char *argv[])
44 {
45     
46     return 0;
47 }

MincostMaxflow-Dinic

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 using namespace std;
 6 const int maxpoint=110000,maxedge=1100000,inf=2147483647;
 7 int head[maxpoint],pointsize;
 8 struct edge{int to,next,c,p;}g[maxedge];int gnum=1;
 9 void addedge(int from,int to,int c,int p)
10 {
11     g[++gnum].to=to;g[gnum].c=c;g[gnum].p=p;g[gnum].next=head[from];head[from]=gnum;
12     g[++gnum].to=from;g[gnum].c=0;g[gnum].p=-p;g[gnum].next=head[to];head[to]=gnum;
13 }
14 int dfsstart,dfsend;
15 int d[maxpoint];
16 bool havevis[maxpoint],isin[maxpoint];
17 const int maxq=(1<<18)-1;
18 int q[maxq+1],ql,qr;
19 inline int inc(int&num){int temp=num;num=(num+1)&maxq;return temp;}
20 bool SPFA()
21 {
22     for(int i=1;i<=pointsize;i++)d[i]=inf;
23     ql=qr=0;d[q[inc(qr)]=dfsstart]=0;isin[dfsstart]=true;
24     while(ql!=qr)
25     {
26         int now=q[inc(ql)];
27         for(int i=head[now];i;i=g[i].next)
28             if(g[i].c&&d[g[i].to]>d[now]+g[i].p)
29             {
30                 d[g[i].to]=d[now]+g[i].p;
31                 if(!isin[g[i].to])isin[q[inc(qr)]=g[i].to]=true;
32             }
33         isin[now]=false;
34     }
35     return d[dfsend]<inf;
36 }
37 bool haveans;
38 int flow,cost,dfsans;
39 void DFS(int po)
40 {
41     havevis[po]=true;
42     if(po==dfsend){flow+=dfsans;haveans=true;return ;}
43     int tans=dfsans;
44     for(int i=head[po];i;i=g[i].next)
45         if(g[i].c&&d[g[i].to]==d[po]+g[i].p&&!havevis[g[i].to])
46         {
47             dfsans=min(dfsans,g[i].c);
48             DFS(g[i].to);
49             if(haveans)
50             {
51                 g[i].c-=dfsans,g[i^1].c+=dfsans;
52                 cost+=dfsans*g[i].p;
53                 return ;
54             }
55             dfsans=tans;
56         }
57 }
58 void dinic(int start,int end)
59 {
60     dfsstart=start,dfsend=end;
61     cost=flow=0;
62     while(SPFA())
63     {
64         haveans=true;
65         while(haveans)
66         {
67             for(int i=1;i<=pointsize;i++)havevis[i]=false;
68             haveans=false;dfsans=inf;
69             DFS(start);
70         }
71     }
72 }
73 int main(int argc ,char *argv[])
74 {
75     
76     return 0;
77 }

NumberTheory

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cmath>
 4 #include <cstring>
 5 #include <algorithm>
 6 using namespace std;
 7 typedef long long LL;
 8 namespace Online
 9 {
10     inline int getnextfactor(int num)
11     {
12         for(int i=2,sqrtnum=(int)sqrt(num);i<=sqrtnum;i++)
13             if(num%i==0)return i;
14         return num;
15     }
16     int phi(int num)
17     {
18         if(num<=1)return 0;
19         int ans=num;
20         while(num>1)
21         {
22             int q=getnextfactor(num);
23             ans=ans/q*(q-1);
24             while(num%q==0)num/=q;
25         }
26         return ans;
27     }
28     LL gcd(LL a,LL b){return b?gcd(b,a%b):a;}
29     LL exgcd(LL a,LL b,LL&x,LL&y)
30     {
31         if(!b){x=1,y=0;return a;}
32         else{LL g=exgcd(b,a%b,x,y),t=x;x=y;y=t-a/b*y;return g;}
33     }
34 }
35 namespace Offline
36 {
37     const int maxsize=210000;
38     int prime[maxsize],pnum;
39     bool isprime[maxsize];
40     int phi[maxsize];
41     void getlist(int listsize)
42     {
43         for(int i=2;i<=listsize;i++)isprime[i]=true;
44         for(int i=2;i<=listsize;i++)
45         {
46             if(isprime[i])phi[prime[++pnum]=i]=i-1;
47             for(int j=1;j<=pnum&&i*prime[j]<=listsize;j++)
48             {
49                 isprime[i*prime[j]]=false;
50                 if(i%prime[j]==0)
51                 {
52                     phi[i*prime[j]]=phi[i]*prime[j];
53                     break;
54                 }
55                 phi[i*prime[j]]=phi[i]*phi[prime[j]];
56             }
57         }
58     }
59 }
60 namespace Mod_equation
61 {
62     int n;
63     LL a[21000],b[21000];
64     //x=a (mod b);
65     LL la,lb;
66     void solve()
67     {
68         la=a[1];lb=b[1];
69         for(int i=2;i<=n;i++)
70         {
71             LL na=a[i],nb=b[i];
72             LL p,q,g=Online::exgcd(lb,nb,p,q),d=na-la;
73             if(d%g)return ;
74             LL t=nb/g;p=(p*d/g%t+t)%t;
75             la+    =lb*p;lb=nb*lb/g;
76         }
77     }
78 }
79 int main(int argc, char *argv[])
80 {
81     
82     return 0;
83 }

Tarjan(强连通)

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 using namespace std;
 6 const int maxpoint=11000,maxedge=51000;
 7 int n,m;
 8 struct point{int head,dfn,low,wk,instack;}p[maxpoint];
 9 struct edge{int next,to;}g[maxedge];int gnum;
10 void addedge(int from,int to)
11 {
12     g[++gnum].to=to;g[gnum].next=p[from].head;p[from].head=gnum;
13 }
14 struct block{int size;}b[maxpoint];int bnum;
15 int dfsnum;
16 int s[maxpoint],sr=0;
17 void tarjan(int po)
18 {
19     p[po].dfn=p[po].low=++dfsnum;
20     p[s[++sr]=po].instack=true;
21     for(int i=p[po].head;i;i=g[i].next)
22     {
23         if(!p[g[i].to].dfn)
24             tarjan(g[i].to),p[po].low=min(p[po].low,p[g[i].to].low);
25         else if(p[g[i].to].instack)
26             p[po].low=min(p[po].low,p[g[i].to].dfn);
27     }
28     if(p[po].dfn==p[po].low)
29     {
30         bnum++;
31         while(s[sr]!=po)p[s[sr]].instack=false,b[p[s[sr--]].wk=bnum].size++;
32         p[s[sr]].instack=false,b[p[s[sr--]].wk=bnum].size++;
33     }
34 }
35 int main(int argc, char *argv[])
36 {
37     
38     return 0;
39 }

Link-Cut Tree

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct node{int s[2],f,ws,rev;}p[210000];
inline void maintain(int po){}
inline void setson(int f,int s,int ws){p[p[f].s[p[s].ws=ws]=s].f=f;}
inline bool isroot(int po){return (!p[po].f)||(p[p[po].f].s[0]!=po&&p[p[po].f].s[1]!=po);}
inline void rotate(int po,int ws)
{
    int son=p[po].s[ws];
    if(isroot(po))p[son].f=p[po].f;
    else setson(p[po].f,son,p[po].ws);
    setson(po,p[son].s[!ws],ws);
    setson(son,po,!ws);
    maintain(po);maintain(son);
}
inline void reverse(int po)
{
    if(p[po].rev)
    {
        swap(p[po].s[0],p[po].s[1]);
        p[p[po].s[0]].ws^=1,p[p[po].s[1]].ws^=1;
        p[p[po].s[0]].rev^=1,p[p[po].s[1]].rev^=1;
        p[po].rev^=1;
    }
}
inline int splay(int po)
{
    while(!isroot(po))
    {
        int fa=p[po].f,gf=p[fa].f;
        reverse(gf);reverse(fa);reverse(po);
        if(isroot(fa)){rotate(fa,p[po].ws);break;}
        if(p[po].ws==p[fa].ws)rotate(gf,p[fa].ws);
        rotate(fa,p[po].ws);
    }
    reverse(po);maintain(po);
    return po;
}
inline void access(int po)
{
    for(int last=0;po;last=po,po=p[po].f)
        splay(po),setson(po,last,1),maintain(po);
}
inline void makeroot(int po){access(po);splay(po);p[po].rev^=1;}
inline void link(int u,int v){makeroot(u);p[u].f=v;}
inline void cut(int u,int v){makeroot(u);access(u);splay(v);p[v].f=0;}
int main(int argc, char *argv[])
{
    
    return 0;
}

 

推荐阅读