后缀自动机入门/基本概念
教程链接
(本文为适应自己的理解,对原文做出删改,建议到原文学习)
后缀自动机可以干啥?
后缀自动机(SAM)可以解决许多字符串相关问题。是一个特别nb的数据结构。它可以:
1.在另一个字符串中搜索一个字符串的所有出现位置。
2.计算给定的字符串中有多少个不同的子串。
SAM是啥?
》》SAM是一个有向无环图。节点被称为状态,边就是状态之间的转移。
》》图存在一个源点 t 0 t_0 t0 ,称作 初始状态 ,其它各结点均可从 出发到达。
》》每个边上表示一个字母,类似边权,从一个节点出发的所有边字母都不同。
》》存在终止状态 。如果我们从 t 0 t_0 t0 出发,最终转移到了一个终止状态,则路径上的所有转移连接起来一定是字符串的一个后缀。 字符串的每个后缀均可用一条从 t 0 t_0 t0到某个终止状态的路径构成。
》》最后以最少的节点构成上述的数据结构,我们就得到了一个后缀自动机。
SAM记录了字符串的所有子串信息,SAM上的任意一个从 t 0 t_0 t0出发的路径都是它的子串,每个子串都在SAM上找到一个对应路径。
构造SAM?
参考原教程图示即可理解。(做图太麻烦 )
我们引入 e n d p o s ( t ) endpos(t) endpos(t)为字符串中t出现的位置。如:“abcbc” 我们有 e n d p o s ( “ b c ” ) = 2 , 4 endpos(“bc”) =2, 4 endpos(“bc”)=2,4
如果两个不同子串的 e n d p o s endpos endpos可能相等,我们把他们归为一个等价类。我们把这些等价类数量累计,然后+1,就是这个SAM的总状态数。我们可以用这个假设构造SAM。
对于这个 e n d p o s endpos endpos我们可以很容易的理解它的几个性质:
如果有两个endpos相同的子串,则存在一个肯定是另一个的后缀。
扩展一下:
如果有两个子串u和v,(设|u|<=|w|)则它们的endpos只有两种情况:
1. e n d p o s ( u ) ∩ e n d p o s ( w ) = ∅ endpos(u) \cap endpos(w)=\varnothing endpos(u)∩endpos(w)=∅
2. e n d p o s ( w ) ⊆ e n d p o s ( u ) endpos(w) \subseteq endpos(u) endpos(w)⊆endpos(u)
这由u是不是w的一个后缀决定。
后缀链接link
我们想象一个SAM的一个非空状态v,我们通过前面的学习,知道了v应该属于某endpos等价类。定义其中最长的一个子串为w。则,等价类其他的字符串都是w的后缀。另外,我们也知道,w的后缀构成的endpos等价类都把w构成的这个等价类包含在内。这时我们设一个w的最长后缀t。令t满足:
e n d p o s ( w ) ⊂ e n d p o s ( t ) endpos(w) \sub endpos(t) endpos(w)⊂endpos(t)
然后将v的后缀链接到t上。一个 l i n k ( v ) link(v) link(v)应该链接到对应于w的最长后缀的另一个endpos等价类的状态。则这些链接构成一棵树。
图示见原教程
后缀自动机入门/基本概念相关推荐
- hihoCoder #1441 : 后缀自动机一·基本概念
题目链接 输入 第一行包含一个字符串S,S长度不超过50. 第二行包含一个整数N,表示询问的数目.(1 <= N <= 10) 以下N行每行包括一个S的子串s,s不为空串. 输出 对于每一 ...
- 【hiho】127 后缀自动机一·基本概念 【后缀自动机】
传送门:后缀自动机一·基本概念 后缀自动机(Suffix Automaton,简称SAM)是处理字符串的很强大的工具,对于一个字符串S,它对应的后缀自动机是一个最小的确定有限状态自动机(DFA),接受 ...
- HihoCoder - 1441 后缀自动机一·基本概念(模拟,后缀自动机入门好题)
题目链接:点击查看 题目大意:给出后缀自动机的定义以及各部分的参数,要求模拟后缀自动机的各个部分 题目分析:直接按照后缀自动机的定义模拟就好了,因为字符串的长度只有50,所以可以用n^3的算法暴力,还 ...
- HihoCoder - 1441 后缀自动机一·基本概念(模拟)
描述 小Hi:今天我们来学习一个强大的字符串处理工具:后缀自动机(Suffix Automaton,简称SAM).对于一个字符串S,它对应的后缀自动机是一个最小的确定有限状态自动机(DFA),接受且只 ...
- 后缀自动机Suffix Links的应用
前置: 后缀自动机SAM基本概念:https://blog.csdn.net/Jaihk662/article/details/82823251 后缀自动机线性构造方法:https://blog.cs ...
- 后缀自动机线性构造方法
前置(后缀自动机SAM基本概念):https://blog.csdn.net/Jaihk662/article/details/82823251 来源:http://hihocoder.com/pro ...
- 【BZOJ2780】【SPOJ】Sevenk Love Oimaster(广义后缀自动机)
Description 有n个大串和m个询问,每次给出一个字符串s询问在多少个大串中出现过. Solution 广义后缀自动机入门题. 其实就是在插入一个串后将last设为root即可. 然后统计每个 ...
- 后缀自动机概念的温习
觉得对于一个数据结构充分的学会使用,一定要对它的构成部分和定义概念有很充分很全面的了解. 所以我觉得的一种温习的最好方式就是:明晰概念->分析运用这样的层次. 概念的明晰确实是十分有用的,它既是 ...
- 后缀自动机:从入门到放弃
写在前面 后缀自动机,简称SAMSAMSAM,是一种十分优秀的字符串匹(shu)配(ju)算(jie)法(gou) 字符串界的bossbossboss,几乎可以解决全部正常的字符串题目 至少我前前后后 ...
最新文章
- JNI学习开始篇 基础知识 数据映射及学习资料收集
- 显示非模式窗口和模式窗口
- dvd清洗碟效果好吗_用什么清洗抽油烟机效果比较好?有哪些注意事项?
- linux运行python乱码_linux下python中文乱码解决方案详解
- 如何找到Eclipse左侧项目栏
- [密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第7篇]随机性如何辅助计算和什么是BPP类问题
- Tracing mysqld Using DTrace
- 04.卷积神经网络 W2.深度卷积网络:实例探究
- HBaseConAsia 2019盛会来袭
- 最大流算法(Edmons-Karp + Dinic 比较) + Ford-Fulkson 简要证明
- newlisp 注释生成文档
- HDU 6182 2017广西邀请赛:A Math Problem
- JS动态呈现还可以输入字数
- 新建数据库监听端口被占用
- 服务器的使用:Linux一键搭建KMS激活服务器
- 【剑拔峨眉 团队裂变】蜜拓蜜教育高端特训营第二期即将上线
- 物联网毕业设计 - 智能运动计步系统(物联网 嵌入式 单片机 stm32)
- 分析加工贸易企业三帐难以平衡的根本原因
- 使用javascript通过className来获取元素
- 如何判断牛市是否来了,看这4种指标就够了
热门文章
- 故障模块名称: mso.dll
- 贝壳找房算数(中等)
- Forth(背包!动态规则)
- spring boot 使用javaMailSender 发送qq邮箱验证码
- Windows: Ctrl,Alt, Shift等快捷键的含义
- Outlook/Microsfot邮件配置:QQ邮箱/腾讯企业邮箱
- Weblogic10.3.6升级2021年10月补丁p33172858_1036_Generic.zip实践
- 蓝桥杯 真题:明码 一题掌握3种码
- 【Chrome】从Google官网下载 Google Chrome 离线安装包
- 生命中最美的风景就是曾经遇见了你