acm算法模板2Word格式.docx
- 文档编号:18740856
- 上传时间:2022-12-31
- 格式:DOCX
- 页数:207
- 大小:75.47KB
acm算法模板2Word格式.docx
《acm算法模板2Word格式.docx》由会员分享,可在线阅读,更多相关《acm算法模板2Word格式.docx(207页珍藏版)》请在冰豆网上搜索。
一般性结论54
石子合并54
pku1160有n个村子要建p个邮局55
单调队列56
题目类型总结56
pku2823求数列中定长区间的最大最小值57
hdu2430预处理g[x]=i表示s[i]%p==x的第一个i58
noi05_adv190060
pku2373f[i]=max(f[i-2*b]..f[i-2*a])+162
zoj3031邮件分发63
pku1821n个工人刷长为m的墙64
平衡二叉树65
pku1765算每个屋檐的降雨量,扫除线+treap65
静态平衡二叉树hrb508668
Pku235271
pku33785维逆序对72
归并排序74
Hrb5085树状数组78
pku3321AppleTree欧拉序列+树状数组79
线段树81
题目类型总结81
线段树总结81
Pku3225集合操作线段树翻转82
pku1769线段树+dp(动态查询修改某一区间的信息)86
Hdu2430线段树dp询问长度为k的区间中的最小值。
87
Netflow88
网络流题目类型总结:
88
pku3680dinic+消圈89
07beijing_H94
Pku3469构图(关键),求最小98
Pku3204求割边。
100
Hdu2435求最小割,再在残余网络中求最大流103
Pku3155最大密度子图(?
)107
二分图匹配111
最大匹配111
Dfs111
Hrb508701染色判奇环,二分图最大匹配112
Pku3692最大完全子图114
最优匹配116
zju3035KM116
Zju3035bylzx118
连通性121
(强连通)Pku1236121
(单向连通)pku2762124
求桥127
Pku1438在保证图仍然为强连通的前提下,把尽量多的双向边改为单向边127
Pku3177无向图求二连通子图128
2sat130
一般性结论:
130
PKU2723二分+2-sat验证,131
pku3683n个婚礼问能否全部举行,要求构造解134
lca139
字符串处理143
后缀数组模板143
后缀树pku1743乐谱最长的相似(差值相同)的乐章的长度145
后缀树+后缀数组pku3693最大重复(连续重复次数最多)子序列150
dfapku3691有穷状态自动机157
矩阵乘法
#include<
iostream>
usingnamespacestd;
constintmaxn=32;
intm,mod;
intf[maxn][maxn],g[maxn][maxn],d[maxn][maxn];
voiddfs(intd,inta,intb){
if(d==m){g[a][b]=1;
return;
}
if(a&
(1<
<
d))dfs(d+1,a,b);
else{
dfs(d+1,a,b|(1<
d));
if((d<
m-1)&
&
!
(a&
(d+1))))dfs(d+2,a,b);
}
voidmul(intn,intc[maxn][maxn],inta[maxn][maxn],intb[maxn][maxn]){
inti,j,k;
memset(d,0,sizeof(d));
for(i=0;
i<
n;
i++)
for(j=0;
j<
j++)
for(k=0;
k<
k++)
d[i][j]=(d[i][j]+a[i][k]*b[k][j])%mod;
memcpy(c,d,sizeof(d));
intmain(){
intn,i;
cin>
>
n>
m>
mod;
memset(g,0,sizeof(g));
m);
i++)dfs(0,i,0);
memset(f,0,sizeof(f));
i++)f[0][i]=1;
f[0][0]=1;
while(n>
0){
if(n&
1)mul(1<
m,f,f,g);
mul(1<
m,g,g,g);
n>
=1;
cout<
f[0][0]<
endl;
return0;
pku3233S=A+A2+A3+…+Ak.
constintmaxn=100;
intmod;
intg[maxn][maxn],f[maxn][maxn];
intn;
voidmul(intc[maxn][maxn],inta[maxn][maxn],intb[maxn][maxn]){
intt[maxn][maxn];
for(i=1;
=2*n;
for(j=1;
j++){
t[i][j]=0;
for(k=1;
t[i][j]=(t[i][j]+a[i][k]*b[k][j])%mod;
}
memcpy(c,t,sizeof(t));
intk,i,j;
k>
=n;
scanf("
%d"
&
g[i][j]);
g[i][j+n]=g[i][j];
i++)g[i+n][i+n]=1;
i++)f[i][i]=1;
while(k>
if(k&
1)mul(f,f,g);
mul(g,g,g);
k>
i++){
printf("
%d"
f[i][j+n]);
printf("
\n"
);
pku2778不含疾病基因的长度为n的的基因总数
constintmaxn=200+100;
constintmod=100000;
structtrienode{
intcount,i,f,dep,sta;
charc;
boolfinal;
intchild[6];
};
trienodetrie[maxn];
charF[20][20];
intsac[maxn];
intf[101][101],g[101][101],tp[101][101];
intsize,n,m,stas;
intgetnum(charc){
if(c=='
A'
)return0;
C'
)return1;
G'
)return2;
T'
)return3;
return-100000;
voidinsert(int&
i,intf,intp,intdep,char*s){
if(i==0){
i=++size;
trie[i].dep=dep;
trie[i].f=f;
trie[i].c=s[-1];
if(s[0]==0){
trie[i].count++;
trie[i].i=p;
trie[i].final=true;
elseinsert(trie[i].child[getnum(s[0])],i,p,dep+1,s+1);
intque[maxn];
voidbuild_ac(introot){
inti,f,d,l,r,j;
sac[root]=root;
trie[root].f=root;
l=0;
r=1;
que[1]=root;
while(l<
r){
i=que[++l];
4;
if(trie[i].child[j]>
0)que[++r]=trie[i].child[j];
f=trie[i].f;
if(f==root)sac[i]=root;
else{
d=sac[f];
c=trie[i].c;
while(d!
=root&
trie[d].child[getnum(c)]==0)
d=sac[d];
if(trie[d].child[getnum(c)]!
=0){
sac[i]=trie[d].child[getnum(c)];
if(trie[sac[i]].final)trie[i].final=true;
}
elsesac[i]=root;
if(!
trie[i].final)trie[i].sta=++stas;
voidmul(intg[101][101],intf[101][101]){
memset(tp,0,sizeof(tp));
=stas;
tp[i][j]=(tp[i][j]+(longlong)g[i][k]*f[k][j])%mod;
memcpy(g,tp,sizeof(tp));
introot,i,j,k,ans;
root=size=1;
stas=0;
memset(trie,0,sizeof(trie));
=m;
scanf("
%s"
F[i]+1);
insert(root,0,i,0,F[i]+1);
memset(sac,0,sizeof(sac));
build_ac(root);
=size;
trie[i].final)
for(j=0;
k=i;
while(k!
trie[k].child[j]==0)k=sac[k];
if(trie[k].child[j]==0)f[trie[i].sta][trie[root].sta]++;
else{
k=trie[k].child[j];
if(!
trie[k].final)f[trie[i].sta][trie[k].sta]++;
}
i++)g[i][i]=1;
1)mul(g,f);
mul(f,f);
ans=0;
ans=(ans+g[1][i])%mod;
ans<
voj1049题目大意:
顺次给出m个置换,反复使用这m个置换对初始序列进行操作,问k次置换后的序列。
m<
=10,k<
2^31。
constintmaxn=110;
constintmaxm=30;
intf[maxm][maxn];
inta[maxn],b[maxn],c[maxn];
intn,m,k,i,j,x,nn,q;
k;
i++)f[0][i]=i;
j++){scanf("
x);
f[i][j]=f[i-1][x];
memset(a,0,sizeof(a));
i++)a[i]=i;
memcpy(b,f[m],sizeof(b));
nn=k/m;
q=k%m;
while(nn>
if(nn&
1){
for(i=1;
i++)c[i]=a[b[i]];
memcpy(a,c,sizeof(c));
for(i=1;
i++)c[i]=b[b[i]];
memcpy(b,c,sizeof(c));
nn>
i++)c[i]=a[f[q][i]];
memcpy(a,c,sizeof(a));
a[i]);
if(i==n)printf("
elseprintf("
"
Voj1067
我们可以用上面的方法二分求出任何一个线性递推式的第n项,其对应矩阵的构造方法为:
在右上角的(n-1)*(n-1)的小矩阵中的主对角线上填1,矩阵第n行填对应的系数,其它地方都填0。
例如,我们可以用下面的矩阵乘法来二分计算f(n)=4f(n-1)-3f(n-2)+2f(n-4)的第k项:
利用矩阵乘法求解线性递推关系的题目我能编出一卡车来。
这里给出的例题是系数全为1的情况。
constintmaxn=12;
constintmod=7777777;
longlongc[maxn][maxn],a[maxn][maxn],d[maxn][maxn];
longlongf[maxn];
voidmul(intn,longlongc[maxn][maxn],longlonga[maxn][maxn],longlongb[maxn][maxn]){
intn,k,i,j;
longlongans;
f[0]=1;
=k;
f[i]=0;
i;
j++)f[i]+=f[j];
if(n<
=k)cout<
f[n]<
n=n-k;
memset(c,0,sizeof(c));
i++)c[i][i]=1;
memset(a,0,sizeof(a));
i++)a[i][i+1]=1;
i++)a[k][i]=1;
while(n>
if(n&
1)mul(k,c,c,a);
mul(k,a,a,a);
n>
ans=0;
i++)ans=(ans+c[k][i]*f[i])%mod;
cout<
高斯削元
Ural01高斯消元
constintmaxn=260;
boolans[maxn],any[maxn],t[maxn][maxn];
intsearch(ints){
inti;
for(i=s+1;
if(t[i][s])returni;
voidinit(){
inti,j;
memset(t,0,sizeof(t));
memset(ans,0,sizeof(ans));
memset(any,0,sizeof(any));
while
(1){
j);
if(j==-1)break;
t[j][i]=true;
t[i][n+1]=true;
voidgauss(){
inti,j,k,s;
boolx;
{
t[i][i]){
s=search(i);
if(s==0){any[i]=true;
continue;
for(j=i;
=n+1;
j++){x=t[i][j];
t[i][j]=t[s][j];
t[s][j]=x;
for(j=i+1;
if(t[j][i]){
for(k=i+1;
t[j][k]^=t[i][k];
t[j][i]=false;
if(!
t[n][n])
t[n][n+1])any[n]=true;
else{cout<
"
Nosolution"
for(i=n;
i>
i--)
if(any[i])ans[i]=false;
else{
x=t[i][n+1];
for(j=i+1;
x^=(t[i][j]&
ans[j]);
ans[i]=x;
if(ans[i])printf("
i);
//freopen("
heat.in"
"
r"
stdin);
heat.out"
w"
stdout);
init();
gauss();
01转换为mod2
constintmod=2;
inta[maxn][maxn];
boolany[maxn],ans[maxn];
if(a[i][s]!
=0)returni;
a[j][i]=1;
a[i][n+1]=1;
voidgauss()
{
inti,j,k,s,x;
if(a[i][i]==0){
c
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- acm 算法 模板
![提示](https://static.bdocx.com/images/bang_tan.gif)