字符串算法总结

KMP

AC 自动机 ACAM

exKMP Z 函数

manacher

后缀自动机 SAM

结论与思考

  1. 一个节点 i 到根节点的链上所有节点 endpos 的并集是以 i 为结尾的所有字符串(以 i 为结尾的后缀)。
  2. 节点 i 的 endpos 里所有后缀的出现次数相等,且儿子的 endpos 里的字符串长度一定大于父亲的长度。
  3. 节点 i 里所有节点各自的出现次数为 cnticnti 可以通过树形 dp 后求出,也就是该节点的 endpos 大小。
  4. SAM 上匹配到一个节点后,可以不断删除要匹配的字符串的开头,当长度小于等于父亲的 longest 时移动到父节点即可。因为节点 i 存的是以 i 为结尾的后缀。
  5. 一个等价类,即一个节点 i 中字符串的个数为 lenilenfai
  6. SAM 上从根节点到任意节点的路径是原串的一个子串,原串的一个子串也一定能用某条从根节点出发的路径表示。
  7. SAM 最多只有 2n1 个节点, 3n4 条边。
  8. SAM 的转移边构成一个 DAG。
  9. 父节点的 endpos 集合一定包含了子节点的 endpos 集合。注意 endpos 集合存的是出现位置的末尾。
  10. SAM 上每个节点代表的不止一个字符串,只有知道了是从根到该节点的哪条路径走来的,才能确定现在的字符串。
  11. endpos 集合间要么包含,要么无交。因此可以构成树形结构。endpos 集合越大,其中包含的字符串的长度越小。
  12. SAM 里转移边的含义是在后面加入字符 c 后,新的字符串的 endpos 集合属于哪个节点。
  13. SAM 里后缀链接树边的含义是最长的和自己的 endpos 不同的后缀所在的节点。
  14. 两个节点在 SAM 后缀链接树中的 LCA 是它们的最长公共后缀。
  15. 一个节点的 endpos 大小表示从根节点到该节点一共有多少条路径。
  16. 原串的一个子串所在的节点可以先在建 SAM 时预处理每一个字符作为结尾时的所在节点,然后倍增跳后缀链接树,找到第一个 longest 大于等于子串长度的节点即可。
  17. 某节点的 endpos 集合可以用线段树合并或启发式合并维护。

实现

  1. SAM 具体树形 dp 可以用桶排序代替,实现更小的常数。

后缀数组 SA

回文自动机 PAM

posted @   KS_Fszha  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示