0
点赞
收藏
分享

微信扫一扫

回文树 PAM 学习笔记


摘自 《2017 年国家集训队论文》“ 回文树及其应用 ”

  • 一些规定 : 表示字符集大小
    和字符 ,用 表示将 接在
  • 回文树:回文树是一棵由两棵树组成的森林,两棵树的根分别为,回文树上的除根以外的一个结点表示一个字符串,每条边有一个字符, 表示一个结点代表的字符串的长度,一个结点代表的字符串可以由如下方式得到:
    从根开始沿着路径走,走过一条边就将边上的字母添加到两边,即 ,其中从 出发的第一步只添加一个字符
    表示一个结点的失配指针,一个成型的回文树如下:
  • 回文树 PAM 学习笔记_回文串_12

  • 容易注意到,一个长为 的字符串的 结点数为 ,要证明这点,我们只需要证明一个长为 的串的本质不同子串数为 ,考虑数学归纳法:
    时成立
    时假设,考虑 与前面的串形成的新的回文后缀,不妨设这些右端点为 ,若右端点为空集,那么 自成回文串,否则注意到若 是一个回文串的话,那么 也为一个回文串,而
  • 构造方法:
    我们需要对每个串 找到它的最长回文后缀,对此,我们在 代表的串的最长后缀的 链上找一个最长的串 ,满足 ,那么 代表的回文串为 ,我们新建一个结点表示这个点后,还需要求出它的 ,这一步相当于在 的链上求一个最长的串 满足
  • 复杂度分析:空间复杂度,时间复杂度
    考虑势能分析跳 树的这一步,一是找最长回文后缀的贡献,一是找 的贡献,二者是同阶的,我们分析前者,假设最长回文后缀为 ,那么有 ,故只会增长 次,所以一共会跳至多 ,在 处检查 是否存在,花费 的代价
    当然也可以变成
  • 集合,即 树中子树右端点的点集,性质与
  • 前端插入:
    对此,我们需要维护 来寻找最长回文前缀,而注意到每个串都是回文串的性质,发现有
  • 不基于势能分析的插入方法:
    我们对一个结点 维护 表示 最长的满足前驱为 的回文后缀
    注意到 没有什么区别,我们将 复制给
    的前驱,后用 来更新 即可
    树上建


举报

相关推荐

0 条评论