后缀自动机(Suffix Automaton)详解:原理、构建与应用
1. 什么是后缀自动机后缀自动机Suffix Automaton简称 SAM是一种用于处理字符串的有限状态自动机。它能够接受给定字符串S的所有后缀并且是满足这一性质的最小确定性有限状态自动机。后缀自动机在字符串匹配、子串计数、最长公共子串等问题中有着广泛的应用。2. 核心概念与性质2.1 状态与转移后缀自动机由一组状态节点和转移边构成。每个状态代表字符串S的某个等价类该类中的所有子串具有相同的结束位置集合即 right 集合。转移边表示在当前字符串后添加一个字符所能到达的新状态。2.2 后缀链接Link每个状态都有一个后缀链接suffix link指向一个状态该状态所代表的子串是当前状态所代表子串的最长真后缀。后缀链接构成了一个树形结构称为后缀链接树Link Tree。2.3 关键性质状态数对于长度为n的字符串后缀自动机的状态数不超过2n-1。转移数转移边的数量不超过3n-4。线性构建可以在O(n)时间内在线构建后缀自动机。3. 构建算法增量法后缀自动机通常采用增量法在线构建每次向当前字符串末尾添加一个字符c。以下是构建过程的伪代码描述struct State { int len, link; mapchar, int next; }; vectorState st; int last, sz; void sa_init() { st.resize(1); st[0].len 0; st[0].link -1; last 0; sz 1; } void sa_extend(char c) { int cur sz; st.push_back(State()); st[cur].len st[last].len 1; int p last; while (p ! -1 !st[p].next.count(c)) { st[p].next[c] cur; p st[p].link; } if (p -1) { st[cur].link 0; } else { int q st[p].next[c]; if (st[p].len 1 st[q].len) { st[cur].link q; } else { int clone sz; st.push_back(st[q]); st[clone].len st[p].len 1; while (p ! -1 st[p].next[c] q) { st[p].next[c] clone; p st[p].link; } st[q].link st[cur].link clone; } } last cur; }4. 应用场景4.1 不同子串个数利用后缀自动机可以高效计算字符串中不同子串的数量。每个状态v所代表的子串数量为st[v].len - st[st[v].link].len对所有状态求和即可。4.2 最长公共子串LCS对于两个字符串S和T可以构建S的后缀自动机然后用T在自动机上匹配维护当前匹配长度即可在O(|T|)时间内求出最长公共子串。4.3 子串出现次数通过预处理每个状态的 right 集合大小即 endpos 大小可以快速查询任意子串在原串中的出现次数。4.4 字典序第 k 小子串在后缀自动机上 DP 求出每个状态出发能到达的子串数量然后按字典序遍历即可找到第 k 小的子串。5. 代码示例C 实现以下是一个完整的后缀自动机实现包含构建和不同子串个数计算#include iostream #include vector #include map #include string using namespace std; struct SuffixAutomaton { struct State { int len, link; mapchar, int next; }; vectorState st; int last, sz; SuffixAutomaton() { st.resize(1); st[0].len 0; st[0].link -1; last 0; sz 1; } void extend(char c) { int cur sz; st.push_back(State()); st[cur].len st[last].len 1; int p last; while (p ! -1 !st[p].next.count(c)) { st[p].next[c] cur; p st[p].link; } if (p -1) { st[cur].link 0; } else { int q st[p].next[c]; if (st[p].len 1 st[q].len) { st[cur].link q; } else { int clone sz; st.push_back(st[q]); st[clone].len st[p].len 1; while (p ! -1 st[p].next[c] q) { st[p].next[c] clone; p st[p].link; } st[q].link st[cur].link clone; } } last cur; } long long countDistinctSubstrings() { long long ans 0; for (int i 1; i sz; i) { ans st[i].len - st[st[i].link].len; } return ans; } }; int main() { string s ababa; SuffixAutomaton sam; for (char c : s) sam.extend(c); cout 不同子串个数: sam.countDistinctSubstrings() endl; return 0; }6. 总结后缀自动机是一种功能强大且高效的字符串数据结构它在线性时间内构建并支持多种字符串查询操作。虽然其原理和构建算法较为复杂但一旦掌握便能解决许多经典的字符串难题。建议读者通过动手实现代码和解决实际问题来加深理解。

相关新闻

Selenium Manager 核心原理与实战:自动化驱动与浏览器管理指南

Selenium Manager 核心原理与实战:自动化驱动与浏览器管理指南

1. 项目概述:从手动配置到自动化管理的演进如果你是从Selenium 2.x或3.x时代走过来的测试工程师,一定对“浏览器驱动版本不匹配”这个报错深恶痛绝。我记得最清楚的一次是,一个紧急的线上回归测试任务,就因为本地Chrome自动升级到…

2026/10/18 7:54:27 阅读更多 →
一个库搞定所有爬虫难题:零妥协的现代神器

一个库搞定所有爬虫难题:零妥协的现代神器

有在因复杂的网页反爬机制以及繁琐的代码而头疼的状况吗? 今天要给你介绍一款爬虫框架, 它是由开发者Karim打造的全能型的 , 其集成了从单次请求到大规模并发爬取等所有的功能, 还号称“一个库, 零妥协”。核心亮点:它到底强在哪里?并非仅仅只是单一的一…

2026/10/18 7:55:10 阅读更多 →
AI内容创作提质进阶:靠多模型交叉校验,告别劣质文案与逻辑漏洞

AI内容创作提质进阶:靠多模型交叉校验,告别劣质文案与逻辑漏洞

现如今,AI已经成为程序员、自媒体创作者、技术博主、职场文案从业者的必备工具,无论是撰写技术文档、博客干货、行业文案,还是整理项目笔记、科普内容,大家都会借助AI提升创作效率。但绝大多数人都会陷入一个效率高、质量低的创作…

2026/10/18 4:55:21 阅读更多 →

最新新闻

Open-Code-Review:基于CLI与git diffs的AI代码评审范式

Open-Code-Review:基于CLI与git diffs的AI代码评审范式

1. “open-code-review”不是新工具,而是一套可落地的开源协作范式最近在几个技术社区里频繁看到“open-code-review”这个词,有人把它当成某个刚发布的 CLI 工具,有人以为是 GitHub 新功能,还有人直接搜“open-code-review 安装命…

2026/10/19 13:02:20 阅读更多 →
AI一键将Word文档转为信息图:NanoBanana实操指南

AI一键将Word文档转为信息图:NanoBanana实操指南

1. 为什么拿Word文档和信息图过不去:核心需求拆解先说个真实的工作场景。上个月某公司市场部拿到一份十几页的产品调研总结,要在一个下午之内做成一张信息图发到公众号上。如果按传统做法,先通读全文,再提取三四条核心数据&#x…

2026/10/19 13:02:20 阅读更多 →
30天教大模型给孩子讲善恶:AI育儿系统全记录

30天教大模型给孩子讲善恶:AI育儿系统全记录

1. 这个标题是怎么来的:一次让人哭笑不得的对话先交代一下背景。我本职工作是做自然语言处理相关的东西,平时跟大模型打交道比较多。家里有个快四岁的娃,从会说话开始就特别喜欢缠着我问"为什么",比如"为什么不能打…

2026/10/19 13:02:20 阅读更多 →
坚果云团队文件权限怎么设?6种权限场景化指南与进阶技巧

坚果云团队文件权限怎么设?6种权限场景化指南与进阶技巧

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 13:02:20 阅读更多 →
延续前,保密培训档案必须补齐的 3 类记录

延续前,保密培训档案必须补齐的 3 类记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 13:02:20 阅读更多 →
HTTPS加密过程详解:从TLS握手到密钥协商与排障实战

HTTPS加密过程详解:从TLS握手到密钥协商与排障实战

前阵子某公司同事拿了个抓包文件来找我,说某个内部系统的接口访问时好时坏,偶尔卡住十几秒然后报错。我打开抓包软件扫了一眼,发现大量TLS握手中的重传报文,再往下看,原来他压根没把HTTPS加密过程当回事——以为是“握…

2026/10/19 13:01:18 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →