教程链接
(本文为适应自己的理解,对原文做出删改,建议到原文学习)

后缀自动机可以干啥?

后缀自动机(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等价类的状态。则这些链接构成一棵树。
图示见原教程

后缀自动机入门/基本概念相关推荐

  1. hihoCoder #1441 : 后缀自动机一·基本概念

    题目链接 输入 第一行包含一个字符串S,S长度不超过50. 第二行包含一个整数N,表示询问的数目.(1 <= N <= 10) 以下N行每行包括一个S的子串s,s不为空串. 输出 对于每一 ...

  2. 【hiho】127 后缀自动机一·基本概念 【后缀自动机】

    传送门:后缀自动机一·基本概念 后缀自动机(Suffix Automaton,简称SAM)是处理字符串的很强大的工具,对于一个字符串S,它对应的后缀自动机是一个最小的确定有限状态自动机(DFA),接受 ...

  3. HihoCoder - 1441 后缀自动机一·基本概念(模拟,后缀自动机入门好题)

    题目链接:点击查看 题目大意:给出后缀自动机的定义以及各部分的参数,要求模拟后缀自动机的各个部分 题目分析:直接按照后缀自动机的定义模拟就好了,因为字符串的长度只有50,所以可以用n^3的算法暴力,还 ...

  4. HihoCoder - 1441 后缀自动机一·基本概念(模拟)

    描述 小Hi:今天我们来学习一个强大的字符串处理工具:后缀自动机(Suffix Automaton,简称SAM).对于一个字符串S,它对应的后缀自动机是一个最小的确定有限状态自动机(DFA),接受且只 ...

  5. 后缀自动机Suffix Links的应用

    前置: 后缀自动机SAM基本概念:https://blog.csdn.net/Jaihk662/article/details/82823251 后缀自动机线性构造方法:https://blog.cs ...

  6. 后缀自动机线性构造方法

    前置(后缀自动机SAM基本概念):https://blog.csdn.net/Jaihk662/article/details/82823251 来源:http://hihocoder.com/pro ...

  7. 【BZOJ2780】【SPOJ】Sevenk Love Oimaster(广义后缀自动机)

    Description 有n个大串和m个询问,每次给出一个字符串s询问在多少个大串中出现过. Solution 广义后缀自动机入门题. 其实就是在插入一个串后将last设为root即可. 然后统计每个 ...

  8. 后缀自动机概念的温习

    觉得对于一个数据结构充分的学会使用,一定要对它的构成部分和定义概念有很充分很全面的了解. 所以我觉得的一种温习的最好方式就是:明晰概念->分析运用这样的层次. 概念的明晰确实是十分有用的,它既是 ...

  9. 后缀自动机:从入门到放弃

    写在前面 后缀自动机,简称SAMSAMSAM,是一种十分优秀的字符串匹(shu)配(ju)算(jie)法(gou) 字符串界的bossbossboss,几乎可以解决全部正常的字符串题目 至少我前前后后 ...

最新文章

  1. JNI学习开始篇 基础知识 数据映射及学习资料收集
  2. 显示非模式窗口和模式窗口
  3. dvd清洗碟效果好吗_用什么清洗抽油烟机效果比较好?有哪些注意事项?
  4. linux运行python乱码_linux下python中文乱码解决方案详解
  5. 如何找到Eclipse左侧项目栏
  6. [密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第7篇]随机性如何辅助计算和什么是BPP类问题
  7. Tracing mysqld Using DTrace
  8. 04.卷积神经网络 W2.深度卷积网络:实例探究
  9. HBaseConAsia 2019盛会来袭
  10. 最大流算法(Edmons-Karp + Dinic 比较) + Ford-Fulkson 简要证明
  11. newlisp 注释生成文档
  12. HDU 6182 2017广西邀请赛:A Math Problem
  13. JS动态呈现还可以输入字数
  14. 新建数据库监听端口被占用
  15. 服务器的使用:Linux一键搭建KMS激活服务器
  16. 【剑拔峨眉 团队裂变】蜜拓蜜教育高端特训营第二期即将上线
  17. 物联网毕业设计 - 智能运动计步系统(物联网 嵌入式 单片机 stm32)
  18. 分析加工贸易企业三帐难以平衡的根本原因
  19. 使用javascript通过className来获取元素
  20. 如何判断牛市是否来了,看这4种指标就够了

热门文章

  1. 故障模块名称: mso.dll
  2. 贝壳找房算数(中等)
  3. Forth(背包!动态规则)
  4. spring boot 使用javaMailSender 发送qq邮箱验证码
  5. Windows: Ctrl,Alt, Shift等快捷键的含义
  6. Outlook/Microsfot邮件配置:QQ邮箱/腾讯企业邮箱
  7. Weblogic10.3.6升级2021年10月补丁p33172858_1036_Generic.zip实践
  8. 蓝桥杯 真题:明码 一题掌握3种码
  9. 【Chrome】从Google官网下载 Google Chrome 离线安装包
  10. 生命中最美的风景就是曾经遇见了你