模板库
2016-03-12 17:46
218 查看
这里贴出各种算法与数据结构的模板。这篇文章将持续更新。
算法篇
树
求树的重心
[code]void find(int v,int from,int tot) { sum[v]=1; int maxi=0; for(int i=last[v];i;i=next[i]) { int u=to[i]; if(u==from || bz[u]) continue; find(u,v,tot); sum[v]+=sum[u]; maxi=max(maxi,sum[u]); } int t=max(maxi,tot-sum[v]); if(t<=val) val=t,root=v; }
求LCA的倍增算法
[code]int lca(int u,int v) { if(deep[u]<deep[v]) swap(u,v); fd(i,int(log2(deep[u])),0) if(deep[f[u][i]]>=deep[v]) u=f[u][i]; fd(i,int(log2(deep[u])),0) if(f[u][i]!=f[v][i]) u=f[u][i],v=f[v][i]; if(u!=v) return f[u][0]; return u; }
求强连通分量or双连通分量的Tarjan算法
[code]void tarjan(int v) { stack[++top]=v; low[v]=dfn[v]=++now; bz[v]=vis[v]=1; for(int i=last[v];i;i=next[i]) { int u=to[i]; if(dfn[u]==0) { tarjan(u); low[v]=min(low[v],low[u]); } else if(vis[u] && dfn[u]<low[v]) low[v]=dfn[u]; } if(low[v]==dfn[v]) { long long t=0; do { vis[stack[top--]]=0; t++; } while(stack[top+1]!=v); ans+=t*(t-1)/2; } }
数论
extended欧几里得算法
[code]void gcd(ll a,ll b,ll &x,ll &y) { if(b==0) { x=1,y=0; return; } ll xx,yy; gcd(b,a%b,xx,yy); x=yy,y=xx-a/b*yy; }
欧拉函数φ\varphi的计算
[code]ll phi(int n) { ll t=n; for(int i=2;i*i<=n;i++) if(!(n%i)) { t=t/i*(i-1); while(!(n%i)) n/=i; } if(n>1) t=t/n*(n-1); return num; }
线性筛法
[code]void pre(int n) { mu[1]=1; fo(i,2,n) { if(!bz[i]) { mu[i]=-1; pri[++pri[0]]=i; } fo(j,1,pri[0]) { int t=i*pri[j]; if(t>n) break; bz[t]=1; if(i%pri[j]==0) { mu[t]=0; break; } mu[t]=-mu[i]; } } }
字符串
SA的倍增构造
[code]void DA() { int mx=0; fo(i,1,n) mx=max(mx,wv[i]=x[i]=s[i]-'a'+1); fill(ws,ws+mx+1,0); fo(i,1,n) ws[wv[i]]++; fo(i,1,mx) ws[i]+=ws[i-1]; fd(i,n,1) SA[ws[wv[i]]--]=i; for(int len=1;len<=n;len*=2) { int m=0; fo(i,n-len+1,n) y[++m]=i; fo(i,1,n) if(SA[i]>len) y[++m]=SA[i]-len; mx=0; fo(i,1,n) mx=max(mx,wv[i]=x[y[i]]); fill(ws,ws+mx+1,0); fo(i,1,n) ws[wv[i]]++; fo(i,1,mx) ws[i]+=ws[i-1]; fd(i,n,1) SA[ws[wv[i]]--]=y[i]; fo(i,1,n) y[i]=x[i],x[i]=0; x[SA[m=1]]=1; fo(i,2,n) x[SA[i]]=cmp(SA[i-1],SA[i],len)?m:++m; if(m==n) break; } fo(i,1,n) rank[SA[i]]=i; }
相关文章推荐
- iOS runtime 运行时( - 俗谈)
- OpenCV中imshow()出错问题
- 对优酷的一些个人看法
- WCF传byte[]的方法
- BZOJ1391order
- cocos2dx TMX地图
- mysql 字符串函数
- vim的简单使用以及一些常用的命令
- 实现四则运算的功能添加版01
- 单元测试--四则运算2程序(c++)
- 复利计算
- Unity Twist Effect Black Hole
- 手动安装 atom 扩展包 packages
- 【C++】模版的概念、使用方法和深入了解
- activemq下载 解压 启动
- caffe安装笔记
- Oracle导出数据结构和数据表的方法
- 紫书第9章 动态规划初步
- 西邮图书馆(UWP)总结
- 剑指offer 反转链表