国赛前纪要
欢迎补充/斧正!
模板
争取用最简洁的语言描述算法。
字符串
KMP
-
功能:求所有前缀的最长非平凡公共前后缀。
-
常见套路:
- 连边 \(i \rightarrow ne_i\),形成失配树,所有 border 是根链。
- 建立转移自动机。下一位没有的字符从父亲转移,下一步有的直接走过去。从小到大转移即可。
Z函数
-
功能:求出模式串所有后缀和母串的 LCP
-
思想:充分利用当前的最远匹配信息,暴力正确的原因是暴力一次最远匹配就会变大,而这个是单调的。
-
常见套路:未知。
AC 自动机
-
功能:构建了一个实现多串匹配的自动机:每次往后添加一个字符;查询当前添加字符组成的字符串的所有后缀里,有哪些模式串。
-
思想,构建 Trie 图的同时,预处理出来所有结点所代表的前缀字符串的最长非平凡公共前后缀。
-
常见套路:快速枚举一个前缀的有效后缀,根链。
后缀数组
-
功能:求出所有后缀按字典序排序后的排名;求出排名相邻的两个字典序的 LCP。
-
思想,倍增排序,每次按照前 k 个字符字典序为第一关键字,前 k+1~2k 个字符字典序为第二关键字进行基数排序。
-
常见套路:
- 两个后缀的 LCP 是他们 \(\min\limits_{x \in [rk_i+1,rk_j]}\{height_x\}\)
- 建立 SA 的 height 重构树可以高效刻画 LCP。
SAM:
-
功能:将所有字串压缩到 \(O(n)\) 个节点上,同时构建了一个可以添加字符,查找子串的自动机。
-
常见套路:
- endpos 合并
- DAG 剖分实现枚举前缀。
Manacher
- 功能:求出以某个点(边)为中心的最长回文半径。
最小表示法
- 功能:快速判断循环同构。
图论:
最短路:
差分约束:
-
功能:可以求出满足若干二元差值不等式的一组可行解
-
常见套路:
- 求最小值用最长路,反之用最短路。
- 如果一张图上,给每个边指定一个时间戳,若满足所有路径只会经过 \(O(1)\) 条反边。那么按照时间戳的顺序依次增广,将在 \(O(1)\) 次内结束增广,否则有负环或正环存在。
最小生成树:
Prim,Kruskal 不说了。
Boruvka流程:
对于每个联通块,找到它向外邻接的所有边中,连接不同联通块的最小值。每次找完后尝试连接。
常见的做法是,给每个点染颜色为所在联通块的根,然后每个点需要找到它邻接的颜色不同的最小的边,贡献到所在联通块。
最欢情况下每次两两配对,会在 \(\log n\) 轮内结束。
强/点双/边双联通(圆方树)
强联通缩点成为 DAG
边双缩点后成为树,树边为桥。
点双缩点后是圆方树,圆方树上任意两点路径上的所有圆点是二者互达的必经点。
欧拉路
注意一定要搜索完某个点的所有出边后,入栈这个点,最后倒序输出。
原因在于欧拉路径起点终点不同时,如果你提前走进了非环路,就死了,倒序输出能保证非环路在最先入栈。
2-SAT
功能:处理若干个用与连接的二元或判断式的一组解。
做法:对于形如若 \(x=a\),则 \(y=b\) 连边。连边表示可以推出,缩强连通,然后对于有矛盾的变量,若在一个分量内则无解,否则只能取拓扑序最大的。
常见套路:
- 可以使用 \(a \le x\) 作为一个结点,然后连边,这样可以将值域从 \([0,1]\) 扩展到 \([0,V]\)。
流(网络流,费用流)
上下界:若有源汇先从汇连无限流量到源变为无源汇。然后先把每条边设为下界。按照入度和出度的差值考虑从超源还是超汇连
边,每条边流量设为上下界之差即可。

浙公网安备 33010602011771号