跳转至

后缀自动机

前言

SAM 全称后缀自动机,在 NOI 大纲里标记为 10 级算法,但并不是那么难,也算是本人学习的第一个 10 级算法。

记号与约定

字符串为 \(S\)\(\lvert S \rvert\) 表示 \(S\) 的长度。

SAM 的建立

简单来说,SAM(当前的定义)有以下特征:

  • 是一张 DAG,每条边表示一个字符。
  • 存在一个初始节点 \(P\)
  • 存在若干个终止节点 \(T_i\)
  • 对于任意的 \(T_i\),在 \(P\)\(T_i\) 的路径上的所有字符组成的字符串是 \(S\) 的一个后缀。

例如,对于字符串 \(\texttt{pkxpxp}\)