摘自 《2017 年国家集训队论文》“ 回文树及其应用 ”
- 一些规定 :
表示字符集大小
串和字符
,用
表示将
接在
- 回文树:回文树是一棵由两棵树组成的森林,两棵树的根分别为
,回文树上的除根以外的一个结点表示一个字符串,每条边有一个字符,
表示一个结点代表的字符串的长度,一个结点代表的字符串可以由如下方式得到:
从根开始沿着路径走,走过一条边就将边上的字母添加到两边,即,其中从
出发的第一步只添加一个字符
表示一个结点的失配指针,一个成型的回文树如下:
- 容易注意到,一个长为
的字符串的
结点数为
,要证明这点,我们只需要证明一个长为
的串的本质不同子串数为
,考虑数学归纳法:
时成立
时假设
,考虑
与前面的串形成的新的回文后缀,不妨设这些右端点为
,若右端点为空集,那么
自成回文串,否则注意到若
是一个回文串的话,那么
也为一个回文串,而
- 构造方法:
我们需要对每个串找到它的最长回文后缀,对此,我们在
代表的串的最长后缀的
链上找一个最长的串
,满足
,那么
代表的回文串为
,我们新建一个结点表示这个点后,还需要求出它的
,这一步相当于在
的链上求一个最长的串
满足
- 复杂度分析:空间复杂度
,时间复杂度
考虑势能分析跳树的这一步,一是找最长回文后缀的贡献,一是找
的贡献,二者是同阶的,我们分析前者,假设最长回文后缀为
,那么有
,故只会增长
次,所以一共会跳至多
步
,在
处检查
是否存在,花费
的代价
当然也可以变成 集合,即
树中子树右端点的点集,性质与
- 前端插入:
对此,我们需要维护来寻找最长回文前缀,而注意到每个串都是回文串的性质,发现有
- 不基于势能分析的插入方法:
我们对一个结点维护
表示
最长的满足前驱为
的回文后缀
注意到的
和
的
没有什么区别,我们将
的
复制给
令为
的前驱,后用
来更新
的
即可
在树上建