串串总结。
KMP
AC 自动机 ACAM
exKMP Z 函数
manacher
后缀自动机 SAM
结论与思考
- 一个节点 \(i\) 到根节点的链上所有节点 endpos 的并集是以 \(i\) 为结尾的所有字符串(以 \(i\) 为结尾的后缀)。
- 节点 \(i\) 的 endpos 里所有后缀的出现次数相等,且儿子的 endpos 里的字符串长度一定大于父亲的长度。
- 节点 \(i\) 里所有节点各自的出现次数为 \(cnt_i\)。\(cnt_i\) 可以通过树形 dp 后求出,也就是该节点的 endpos 大小。
- SAM 上匹配到一个节点后,可以不断删除要匹配的字符串的开头,当长度小于等于父亲的 \(longest\) 时移动到父节点即可。因为节点 \(i\) 存的是以 \(i\) 为结尾的后缀。
- 一个等价类,即一个节点 \(i\) 中字符串的个数为 \(len_i-len_{fa_i}\)。
- SAM 上从根节点到任意节点的路径是原串的一个子串,原串的一个子串也一定能用某条从根节点出发的路径表示。
- SAM 最多只有 \(2n-1\) 个节点, \(3n-4\) 条边。
- SAM 的转移边构成一个 DAG。
- 父节点的 endpos 集合一定包含了子节点的 endpos 集合。注意 endpos 集合存的是出现位置的末尾。
- SAM 上每个节点代表的不止一个字符串,只有知道了是从根到该节点的哪条路径走来的,才能确定现在的字符串。
- endpos 集合间要么包含,要么无交。因此可以构成树形结构。endpos 集合越大,其中包含的字符串的长度越小。
- SAM 里转移边的含义是在后面加入字符 \(c\) 后,新的字符串的 endpos 集合属于哪个节点。
- SAM 里后缀链接树边的含义是最长的和自己的 endpos 不同的后缀所在的节点。
- 两个节点在 SAM 后缀链接树中的 LCA 是它们的最长公共后缀。
- 一个节点的 endpos 大小表示从根节点到该节点一共有多少条路径。
- 原串的一个子串所在的节点可以先在建 SAM 时预处理每一个字符作为结尾时的所在节点,然后倍增跳后缀链接树,找到第一个 \(longest\) 大于等于子串长度的节点即可。
- 某节点的 endpos 集合可以用线段树合并或启发式合并维护。
实现
- SAM 具体树形 dp 可以用桶排序代替,实现更小的常数。
后缀数组 SA
回文自动机 PAM
posted @
2025-01-15 23:38
KS_Fszha
阅读(
19)
评论()
收藏
举报