Algorithms
inrence
这个作者很懒,什么都没留下…
展开
-
KMP
基本KMP算法基本KMP算法int fail[maxn];void get_fail(int arry[], int l){ fail[0] = fail[1] = 0; for(int i = 2, j = 0; i <= l; ++i){ while(j > 0 && arry[i] != arry[j+1]) j = fail[j]; if(ar原创 2016-06-19 13:12:10 · 205 阅读 · 0 评论 -
拓扑排序
利用栈实现概述 该方法的每一步均是输出当前无后继(即出度为0)的顶点。对于一个DAG,按此方法输出的序列是逆拓扑次序。因此设置一个栈(或向量)T来保存输出的顶点序列,即可得到拓扑序列。若T是栈,则每当输出顶点时,只需做人栈操作,排序完成时将栈中顶点依次出栈即可得拓扑序列。若T是向量,则将输出的顶点从T[n-1]开始依次从后往前存放,即可保证T中存储的顶点是拓扑序列。利用dfs实现概述 当从原创 2016-06-20 23:43:19 · 256 阅读 · 0 评论 -
AC-自动机(AC-Automachine)
代码代码// 0-Rootstruct trie{int size, indx[maxn][26], word[maxn], fail[maxn]; inline int idx(char ff){return ff - 'a';} inline void insert(char s[]){ int u = 0; for(int i = 0; s[i]; +原创 2016-06-20 13:07:27 · 672 阅读 · 0 评论 -
最近公共祖先(LCA)
代码// 倍增int maxbit;int dpth[maxn], ance[maxn][maxb];void dfs(int u, int fath){ dpth[u] = dpth[fath] + 1; ance[u][0] = fath; for(int i = 1; i <= maxbit; ++i) ance[u][i] = ance[ance[u][i-1]]原创 2016-06-22 19:00:07 · 212 阅读 · 0 评论 -
斯坦纳树(Steiner Tree)
简述斯坦纳树可以用来求包含给定点的最小生成树,给定点数目通常为 1010 左右。 f[s][i]f[s][i] 表示连通性至少为 ss,且经过 ii 点的最小生成树大小 方程1. f[s][i]=min(f[s][i]+f[s−ss][i])f[s][i] = min(f[s][i] + f[s-ss][i]) 其中 ssss 为 ss 的子集 方程2. f[s][i]=min(f[原创 2016-07-09 20:31:48 · 4899 阅读 · 0 评论 -
欧拉函数
定义记小于等于 xx 中与 xx 互质的正整数个数为 ϕ(x)\phi(x)计算方法ϕ(x)=xΠki=1(1−1pi)\phi(x) = x\Pi_{i=1}^{k}(1-\frac{1}{p_i})代码线性筛求欧拉函数 O(n)O(n)int tot_prime, prime[maxn], phi[maxn];bool vist[maxn];void get_prime(){ phi[原创 2016-10-13 16:09:40 · 268 阅读 · 0 评论 -
图的连通性算法(Tarjan)
针对有向图// 求强连通分量:按割边缩点vector<int> edge[N];void add_edge(int u, int v){ edge[u].push_back(v);}int cnt, scc, top;int dfn[N], low[N], bel[N], stck[N]; // bel => belong, stck => stackbool inst[N]; //原创 2016-06-21 21:35:06 · 1430 阅读 · 0 评论 -
线性筛
今天在看了各种以及听了各种之后终于算是了解线性筛了… 虽然都是一些很基本的应用但还是觉得各种强大…线性筛素数代码int tot_prime, prime[maxn];bool vist[maxn];void get_prime(){ for(int i = 2; i <= n; ++i){ if(!vist[i]) prime[++tot_prime] = i;原创 2015-07-08 16:48:05 · 426 阅读 · 0 评论 -
快速傅立叶变换(FFT)
昨晚写了各种FFT模板,还是稍微记录一下吧 FFT原理还是上最基本的问题:求C(x)=A(x)B(x)C(x)=A(x)B(x) 其中A(x)=Σi<ni=0aixi B(x)=Σi<mi=0bixiA(x)=\Sigma_{i=0}^{i<n}a_ix^i~B(x)=\Sigma_{i=0}^{i<m}b_ix^i 暴力求解的复杂度为O(n2)O(n^2),FFT则可以在O(nlog原创 2015-07-13 22:00:47 · 2068 阅读 · 0 评论 -
后缀数组(Suffix Array)
快排倍增代码快排倍增代码int n, arry[maxn];int rank[maxn], sa[maxn], _rank[maxn];bool cmpc(int i, int j){ return arry[i] < arry[j]; }int ll;bool cmps(int i, int j){ if(_rank[i] == _rank[j]){ if(原创 2016-06-19 13:24:46 · 527 阅读 · 0 评论 -
动态规划优化
四边形不等式简述函数 f[i][j]f[i][j] ,转移如下: f[i][j]=min(f[i][k]+f[k+1][j]+w[i][j])f[i][j]=min(f[i][k]+f[k+1][j]+w[i][j]) 其中 i≤k<ji≤k<j 若函数 w[i][j]w[i][j] 具有以下两种性质: 1、当 a≤b<c≤da≤b<c≤d 时 w[b][c]≤w[a][d]w[b][c]≤w原创 2016-07-09 15:20:17 · 470 阅读 · 0 评论 -
网络流
SAP代码struct edge{ int v, r, flow; edge(int v, int flow, int r) : v(v), flow(flow), r(r) {}};vector<edge> mp[maxn];void add_edge(int u, int v, int flow){ mp[u].push_back(edge(v, flow, mp[v].原创 2016-06-30 21:37:43 · 193 阅读 · 0 评论 -
树状数组(Binary indexed Tree)
代码int lowbit(int i){ return i & (-i);}int get_sum(int pos){ int rtn = 0; for(int i = pos; i >= 1; i -= lowbit(i)) rtn += c[i]; return rtn;}void modify(int pos, int delta){ for(int i原创 2016-06-26 14:45:19 · 260 阅读 · 0 评论 -
最短路算法
弗洛伊德(Floyd)设dist[k][i][j]dist[k][i][j]表示利用到1...k1...k作为中间点,ii到jj的最短路。for(int k = 1; k <= n; ++k) for(int i = 1; i <= n; ++i) for(int j = 1; j <= n; ++j) dist[k][i][j] = min(dist原创 2016-06-25 11:02:58 · 322 阅读 · 0 评论 -
可持久化线段树
例题查询区间第k大统计区间数字种数Solution用一个 last last 数组记录 array array 中每个数字上次出现的位置,现在问题就可以转化为统计 [left,rght] [left,rght] 中 last last 值小于 left left 的个数。 用 T i T_i 记录 last[i] last[i] 的贡献,即在 T i T_i 的 pos pos 处插入一个 +原创 2016-08-13 19:02:25 · 299 阅读 · 0 评论