核心概述

后缀树/后缀自动机以紧凑结构表示字符串的所有子串,在 O(n) 构建代价下支持存在性、出现次数、不同子串数与最长公共子串等查询,适配静态或增量场景。

原文引述

Description: Suffix tree (compressed trie of all suffixes) or suffix automaton (deterministic acyclic automaton for all substrings). Build O(n). Supports substring occurrence counting, distinct substrings, LCS, etc. Time: Build O(n); query O(|pattern|) for existence/occurrence Status: tested ——摘自本节点现有英文注释

展开阐述

  • 定义与背景、典型适用场景

    • 后缀树:所有后缀的压缩 Trie,边以原串区间 (start, end) 表示;空间线性,支持在线构建与显式后缀操作。
    • 后缀自动机(SAM):描述所有子串的确定性有向无环自动机;空间线性,增量构建,适用于多次查询与统计。
    • 场景:静态全局分析(后缀树);动态插入/多次查询(SAM)。
  • 接口/字段/数据结构与输入输出语义(按仓库约定)

    • SAM 典型结构(据约定风格):
      • Node:
        • next:map<char,int>(或小字符集用数组)。
        • link:后缀链接(suffix link)。
        • len:状态对应的最长子串长度。
      • 全局:初始状态 0,last=0。
    • 输出语义与统计:
      • SAM 状态数 ≤ 2n−1;可通过 endpos 集合大小(拓扑序累加)统计出现次数;
      • 不同子串数为 Σ (len[v] − len[link[v]])。
  • 核心流程与关键要点

    • SAM 扩展字符 c:
      1. 新建 cur,len[cur]=len[last]+1;
      2. 自 p=last 向前,若无 c 转移则补建,直到 p=−1 或遇到已有转移;
      3. 若 p=−1,link[cur]=0;否则令 q=next[p][c]:
        • 若 len[p]+1 == len[q]:link[cur]=q;
        • 否则克隆 q 为 clone:复制转移,len[clone]=len[p]+1,link[clone]=link[q];令 q、cur 的 link 指向 clone,并自 p 向前重定向相关转移;
      4. last=cur。
    • 主要查询:
      • 子串存在性:沿 next 走模式串;中途缺失即不存在;
      • 出现次数:预处理 endpos 大小(拓扑序累加);
      • 不同子串数:Σ (len[v] − len[link[v]]);
      • 最长公共子串:建 SAM 后,在另一串上行走并维护最长匹配;
      • 第 k 小子串:按 len/字典序遍历可生成序列。
    • 后缀树(Ukkonen)要点:
      • 边以原串区间存储;空间线性;支持在线构建;可直接得到全部后缀的显式表示。
  • 复杂度与边界条件

    • 构建:O(n)(均摊常数);查询:存在性 O(|pattern|) 或在计数预处理后 O(1) 抽取统计。
    • 边界:字符集映射需一致;内存线性增长,适合 n 规模较大的场景。
  • 与相邻技术的取舍对比

关联节点