呼,终于在考试之前复习了一遍所有模板。
球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&δ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;
}
来源:oschina
链接:https://my.oschina.net/u/4258176/blog/4530665