Link Search Menu Expand Document

未完成,施工中

SAM – Suffix Automation (Smallest DFA)

Also is DAG – Directed Acyclic Graph

Vertex – State Edge – Transformer

SAM 是一张有向无环图。结点被称作[[State – 状态]],边被称作[[状态]]间的[[转移]]。

图存在一个源点 t_0,称作[[Initial State – 初始状态]],其它各结点均可从 t_0 出发到达。

每个 [[转移]] 都标有一些字母。从一个结点出发的所有[[转移]]均不同。

存在一个或多个[[End State – 终止状态]]。如果我们从初始状态 t_0 出发,最终转移到了一个终止状态,则路径上的所有转移连接起来一定是字符串 s 的一个后缀。

s 的每个后缀均可用一条从 t_0 到某个终止状态的路径构成。

在所有满足上述条件的自动机中,SAM 的结点数是最少的。

t_0 – Ground Zeros (Initial Vertex)

线性时间内通过 SAM 解决

  1. 在另一个字符串中搜索一个字符串的所有出现位置
  2. 计算给定的字符串中有多少个不同的子串

SAM 将给定字符串的所有子串以高度压缩的形式储存

对于一个长度为 n 的字符串,它的空间复杂度仅为 O(n)。 此外,构造 SAM 的时间复杂度仅为 O(n)。

准确地说,一个 SAM 最多有 2n-1 个节点和 3n-4 条[[转移边]]。 (转移边的端点可能会改变)

给定 k 个字符串 找到它们的最长公共子串 – 作为子串出现在每个字符串中的字符串

需要计算可达性 – 对于自动机中的每个状态和每个字符 D_i,是否存在这样的一条路径。可以容易地通过 DFS 或 BFS 及动态规划计算

将所有的子串连接成一个较长的字符串 T,以特殊字符 D_i 分开每个字符串(一个字符对应一个字符串) \(T = S_1 + D_1 + S_2 + D_2 + .. + S_k + D_k\)

对字符串 T 构造后缀自动机 如果 S_j 包含了一个子串,则 SAM 中存在一条从包含字符 D_j 的子串 而不包含以其它字符 D_1, …, D_j-1, D_j+1, …, D_k 开始的路径

References

后缀自动机 (SAM) - OI Wiki