其他分享
首页 > 其他分享> > SAM 基础

SAM 基础

作者:互联网

SAM 的定义

子串的性质

结束位置 endpos

一些引理

后缀链接 link

一些引理

小结

算法

\(\quad\) SAM 是 在线 算法,我们可以以逐个加入字符串中的每个字符,并且在每一步中对应地维护 SAM 。

\(\quad\)为了保证线性的空间复杂度,我们将只保存 $ len$ 和 \(link\) 的值和每个状态的转移列表,我们不会标记终止状态。

\(\quad\)一开始 SAM 只包含一个状态 \(t_0\) ,编号为 \(0\) (其它状态的编号为 \(1,2,...\))。为了方便,对于状态 \(t_0\) 我们指定 \(len=0,link=-1\) (\(-1\) 表示虚拟状态)

\(\quad\)现在,任务转化为实现给当前字符串添加一个字符 \(c\) 的过程。算法流程如下:

\(\quad\)如果我们还想知道哪些状态是 终止状态 而哪些不是,我们可以在为字符串 \(s\) 构造完完整整的 SAM 后找到所有的终止状态。为此,我们从对应整个字符串的状态 (存储在变量 \(last\) 中) ,遍历它的后缀链接,直到到达初始状态。我们将所有遍历到的节点都标记为终止节点。容易理解这样做我们会准确地标记字符串 \(s\) 地所有后缀,这些状态都是终止状态。

正确性证明

操作次数为线性的证明(略)

标签:子串,状态,SAM,后缀,基础,len,endpos,字符串
来源: https://www.cnblogs.com/kzos/p/16388923.html