文化课专栏
[[化学]]: [[物理]]: [[生物]]:
AC自动机
当字符集较大时,可以考虑使用可持久化数组维护 ch 数组 AC自动机上判断某串的子串,考虑枚举前缀然后跳 $fail$ ,可以考虑建出 $fail$ 树,然后在走前缀的过程中用数据结构或连边建图表示出包含关系 # birthday
BSET定理
相关链接:[[矩阵树定理]],[[欧拉回路]] 对于一个有向图,对于它的欧拉回路个数 $ec(G)$ ,有 $$ec(G)=root_{w}(G)\sum_{v\in V}(deg_v -1)!$$其中 $root_w(G)$ 表示以 $w$ 为根的 $G$ 的外向生成树有多少种 注意BEST定理计算的是两点间若干条边有顺序的方案数,如果是 “某条边能够经过的次数” 则应当除去 $\frac{1}{w!}$ 将顺序消掉 例题: # Counting Prefixes # C4
DAG链剖分
对于 DAG 上的节点,设 $f_{u}$ 表示以点 $u$ 为结束点的路径数,$g_u$ 表示从点 $u$ 开始的路径数,那么对于节点 $u$ 的所有出边,若存在一条边 $u \rightarrow v$ 使得 $2f_{v}>f_{u},2g_{v}>g_{u}$ ,那么我们则称 $u,v$ 是一条重边 对于任意一条路径,其路径上的轻边数量一定是 $O(logn)$ 级别的,因为每走一次轻边路径数都会折半 最常用的场景是在 [[后缀自动机]] 上快速的子串定位 为什么不倍增跳呢? #under_construction
KD-Tree
本质:将一个 $k$ 维的立方体内的点压缩到序列上 $O(n^{1-\frac{1}{k}})$ 个不相交区间 而这个序列就可以用正常方法去维护了 例题:# P6783 Ynoi2008 rrusq
Kmp
kmp的fail数组既可以指最长的前后缀长度,也可以指当前位的最长的前缀匹配,也可以指最长的循环节长度 #under_construction 字符串的所有前缀中,有多少个可以构成形如 “ABABA” 由 k 个A 组成的字符串 通过不断跳fail的方式可以求出最短的前缀匹配,可以通过继承优化到 $O(n+m)$ 例子
RMQ问题
考虑一个 $O(n)$ 预处理,$O(1)$ 查询的 RMQ 算法 考虑将序列按照 $logn$ 进行分块,对于不在一个同块内部的询问,我们用ST表维护整块的信息,再额外维护块内的前后缀最大值即可 对于在一个块内的查询,我们可以开一个单调栈维护一个前缀的单调下降序列,每一位使用一个整数状压单调栈内拥有的元素,查询 $l,r$ 时直接找 $r$ 对应的单调栈中第一个 $\ge l$ 的位置即可
STD
找前 $k$ 大/小 元素,用 nth_element() 而非 sort() 会更快
二分答案
区间中位数也可以用二分答案法解决,区间内仅有大小比较的找数问题,都可以用 二分答案+01赋值法解决(例如众数) # HEOI2016/TJOI2016 排序