SAM

定义

结束位置\(endpos\)

\(endpos(a)\) 表示 \(s\) 的子串 \(a\)\(s\)结束位置的集合
\(endpos(a)=endpos(b)\),则称 \(a\)\(b\) 在一个同一个等价类
性质:

  1. \(endpos(a)=endpos(b),|a|<|b|\)\(a\)\(b\) 的后缀。
  2. \(|a|>|b|\),则 \(endpos(a)\in endpos(b)\)\(endpos(a) \cap endpos(b) = \varnothing\)
  3. \(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\)
后缀自动机维护一个字符串前缀的所有后缀,可以表示该字符串所有子串
考虑每次在维护好的字符串后加一个新的字符,更新以该字符为结尾所有后缀
新增的状态为 以上一个字符为结尾所有后缀加该字符该字符自身

  1. 如果





to be continued...

posted @ 2025-07-03 15:36  C_Wish  阅读(7)  评论(0)    收藏  举报