什么是后缀自动机 (SAM)?
后缀自动机(Suffix Automaton, SAM)是一个强大而精巧的数据结构,它能接受一个字符串 S 的所有后缀。更神奇的是,它实际上也接受了 S 的 所有子串。SAM 是一个既包含字符串所有子串信息,又具有最小节点和边数的有向无环图(DAG)。
对于一个长度为 n 的字符串,SAM 的空间复杂度和在线构建的时间复杂度都是线性的 O(n)。
核心概念
- 状态 (State): SAM 中的每个节点代表一个状态,每个状态对应着原字符串中一个或多个子串的集合。
- 转移 (Transition): 状态之间的有向边代表字符的转移。从状态
u到v有一条字符c的转移边,表示在u所代表的子串集合中的所有字符串末尾添加字符c后,得到的新字符串都属于v所代表的子串集合。 - 后缀链接 (Suffix Link): 这是 SAM 最核心的概念之一。每��非初始状态都有一个后缀链接,指向另一个状态。状态
u的后缀链接指向状态v,表示v所代表的子串集合是u所代表的子串集合中 所有字符串 的 最长后缀,且这些后缀也存在于v的子串集合中。所有后缀链接最终都会指向初始状态,形成一棵树状结构(Parent Tree)。