SAM
定义
结束位置\(endpos\)
\(endpos(a)\) 表示 \(s\) 的子串 \(a\) 在 \(s\) 中结束位置的集合。
若 \(endpos(a)=endpos(b)\),则称 \(a\),\(b\) 在一个同一个等价类
性质:
- \(endpos(a)=endpos(b),|a|<|b|\) 则 \(a\) 为 \(b\) 的后缀。
- 若 \(|a|>|b|\),则 \(endpos(a)\in endpos(b)\) 或 \(endpos(a) \cap endpos(b) = \varnothing\)
- 若 \(endpos(a)=endpos(b)\) 且 \(|a|>|b|\) ,则 \(\forall c\) 为 \(a\) 的后缀且 \(|b|<|c|<|a|\),\(endpos(c)=endpos(a)\)
后缀链接\(link\)
\(link(endpos(a))=endpos(b)\) 表示满足 \(endpos(a)\subsetneq endpos(b)\) 的最小 \(endpos(b)\) 。
相应的,后缀自动机的一个节点表示一个 \(endpos(a)\) ,不同节点的 \(endpos\) 不同。
所有的 \(endpos\) 状态通过 \(link\) 在后缀自动机上构成一颗 \(ParentTree\) 。
算法流程
设上一次插入的\(endpos\)
后缀自动机维护一个字符串前缀的所有后缀,可以表示该字符串所有子串
考虑每次在维护好的字符串后加一个新的字符,更新以该字符为结尾所有后缀。
新增的状态为 以上一个字符为结尾的所有后缀加该字符 和 该字符自身。
- 如果
to be continued...