国赛前纪要

欢迎补充/斧正!

模板

争取用最简洁的语言描述算法。

字符串

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]\)

流(网络流,费用流)

上下界:若有源汇先从汇连无限流量到源变为无源汇。然后先把每条边设为下界。按照入度和出度的差值考虑从超源还是超汇连
边,每条边流量设为上下界之差即可。

三/四元环计数

posted @ 2025-07-01 22:01  Richard_whr  阅读(30)  评论(0)    收藏  举报