Commit f8d31bf0 authored by X1 Carbon's avatar X1 Carbon
Browse files

统一名称 回文树

parent f8b87327
Loading
Loading
Loading
Loading
+5 −5
Original line number Diff line number Diff line
@@ -16,17 +16,17 @@

和其它的自动机一样,一个节点的 fail 指针指向的是这个节点所代表的回文串的最长回文后缀所对应的节点,但是转移边并非代表在原节点代表的回文串后加一个字符,而是表示在原节点代表的回文串前后各加一个相同的字符(不难理解,因为要保证存的是回文串)。

我们还需要在每个节点上维护此节点对应回文子串的长度 len,这个信息保证了我们可以轻松地构造出回文自动机
我们还需要在每个节点上维护此节点对应回文子串的长度 len,这个信息保证了我们可以轻松地构造出回文

## 建造

回文自动机不同于其他自动机的地方在于它有两个初始状态,分别代表长度为 $-1,0$ 的回文串。我们可以称它们为奇根,偶根。它们不表示任何实际的字符串,仅作为初始状态存在,这与其他自动机的根节点是异曲同工的。
回文有两个初始状态,分别代表长度为 $-1,0$ 的回文串。我们可以称它们为奇根,偶根。它们不表示任何实际的字符串,仅作为初始状态存在,这与其他自动机的根节点是异曲同工的。

偶根的 fail 指针指向奇根,而我们并不关心奇根的 fail 指针,因为奇根不可能失配(奇根转移出的下一个状态长度为 $1$ ,即单个字符。一定是回文子串)

类似后缀自动机,我们增量构造回文自动机
类似后缀自动机,我们增量构造回文

考虑构造完前 $p-1$ 个字符的回文自动机后,向自动机中添加在原串里位置为 $p$ 的字符。
考虑构造完前 $p-1$ 个字符的回文后,向自动机中添加在原串里位置为 $p$ 的字符。

我们从以上一个字符结尾的最长回文子串对应的节点开始,不断沿着 fail 指针走,直到找到一个节点满足 $s_{p}=s_{p-len-1}$ ,即满足此节点所对应回文子串的上一个字符与待添加字符相同。

@@ -159,7 +159,7 @@ int main() {

## 相关资料

+ [EERTREE: An Efficient Data Structure for Processing Palindromes in Strings](https://arxiv.org/abs/1506.04862)
+ [EERTREE: An Efficient Data Structure for Processing Palindromes in Strings](https://arxiv.org/pdf/1506.04862)

+ [Palindromic tree](http://adilet.org/blog/palindromic-tree/)

+1 −1
Original line number Diff line number Diff line
@@ -162,7 +162,7 @@ nav:
    - 广义后缀自动机: string/general-sam.md
    - 后缀树: string/suffix-tree.md
    - Manacher: string/manacher.md
    - 回文树 (回文自动机): string/pam.md
    - 回文树: string/pam.md
    - 序列自动机: string/seq-automaton.md
    - 最小表示法: string/minimal-string.md
    - Lyndon 分解: string/lyndon.md