感觉高一学的SAM太假了,重学一遍。。。
后缀自动机(SAM)的由来
我们需要一种可以识别串S的所有字串的自动机,我们显然可以把S的所有后缀建成Trie树,那么树上每一个点都代表S的一个子串。但这样状态数是 n2 n 2 级别的,考虑到Trie树上有很多重复部分,所以有了SAM这个东西。
首先定义几个东西
transS,c t r a n s S , c 表示状态 S S 加上字符
所到达的状态。
faS f a S 表示状态 S S 在parent树上的父亲。
表示状态 S S 的右端点集合。
表示状态 S S 的最左能延伸的长度。
SAM的构建
SAM采用的是在线拓展方法,也就是我们要得到串
的SAM,我们可以在串 T T 的SAM加上字符
带来的修改。
设 T T 的长度为
。
具体的步骤如下
1. 从上次拓展的到的点 last l a s t (也就是 Right={
L} R i g h t = { L } 的点)开始,新建节点 np n p , t