数据结构

左偏树

\(\text{dis}(u)=\) 距离 \(u\) 最近的叶子节点(包括本身)到达 \(u\) 的距离。

左偏树有性质:\(\text{dis}(rs_u)\le \text{dis}(ls_u)\),\(\text{dis}(u)=\text{dis}(rs_u)\)。

这样维护的好处是任意删点(合并左右儿子,再向上 pushup 直到符合条件的点立即终止)的复杂度是 \(\log n\) 的,原因在于:删掉点 \(u\),把 \(u\) 的两个儿子合并后 \(\text{dis}'(u)\) 一定 \(\ge \text{dis}(u)-1\)。于是向上 pushup 时每上升一层,\(\text{dis}\) 值就会增加至少 \(1\)。

能持久化,k 短路。

圆方树

圆方树(小粉兔)

对每个点双连通子图建立的一棵树。

https://cdn.luogu.com.cn/upload/pic/55042.png

一个点双连通图的一个定义是:图中任意两不同点之间都有至少两条点不重复的路径。

一个近乎等价的定义是:不存在割点的图。这个定义只在图中只有两个点,一条连接它们的边时失效。它没有割点,但是并不能找到两条不相交的路径,因为只有一条路径。
(也可以理解为那一条路径可以算两次,的确没有交,因为不经过其他点)

Tarjan 算法求出的点双连通图是后者,因此做题时需要特殊判断这种情况,以及孤立点的情况。

一个关于点双很好的性质:对于一个点双中的两点,它们之间简单路径的并集,恰好完全等于这个点双,这可以通过构造最大流 \(=\) 最小割证明,详见 [APIO2018] 铁人两项。

AC 自动机

先建出 Trie,定义一个点 \(u\) 的 \(\text{border}\) 为另一个点 \(v\),满足 \(v\) 在树上的前缀等于 \(u\) 在树上对应的后缀,且 \(v\) 是深度最大的。

查询一个串时,按类似 KMP 的方式找到以枚举的当前位为一段后缀在树上的深度最大的结点,它的所有 \(\text{border}\) 就是在文本串中出现的结点。

找所有 \(\text{border}\) 可以打标记拓扑排序优化。

有一个性质:所有子串在原串中出现的次数的和是 \(O(\sqrt{n})\) 级别的,详见 CF963D,可以记录有效更新结点实现。

posted @ 2023-03-30 21:44  Network_Error  阅读(51)  评论(0)    收藏  举报