首页 > 其他分享 >SAM 笔记

SAM 笔记

时间:2024-06-30 20:11:00浏览次数:1  
标签:cur SAM 后缀 text len link 笔记 copy

SAM 笔记

有人问我 \(\text{endpos}\) 是什么?一个串的 \(\text{endpos}\) 就是它在原串中的所有出现位置右端点集合。

后缀自动机每个节点对应的是一些本质不同的字符串,这些串满足属于同一个等价类,即 \(\text{endpos}\) 相同. 这些串有后缀关系. 后缀链接连向这些串的一个最小后缀(可能为空),使得其 \(\text{endpos}\) 真包含该点的 \(\text{endpos}\).

记录的信息:\(\text{len, link, next[26]}\);全局有一个 \(\text{sz, last, cur}\);

初始化 \(\text{len[0] = 0, link[0] = -1, sz = 0, last = 0}\).(写到代码里只需要 link[0] = -1

\(\text{expand}\):假设加入字符 \(\text c\),加入前的字符串为 \(\text s\)

  1. \(\text{cur}\gets\) ++\(\text{sz}\),\(\text{len(cur)} \gets \text{len(last) + 1}\)
  2. 从 \(\text{last}\) 遍历后缀链接,若当前 \(\text p\) 无 \(\text c\) 边,就加一条到 \(\text{cur}\).
  3. 若遍历到 0,\(\text{link(cur)}\gets 0\),转 8.
  4. 否则找到了一个 \(\text p\) 有 \(\text c\) 出边,停止遍历, 记 \(\text{q = p.next[c]}\)
  5. 若 \(\text{len(p) + 1 = len(q)}\),\(\text{link(cur)} \gets \text{q}\),转 8.
  6. 否则新建 \(\text{copy}\),\(\text{copy}\) 的 \(\text{link}\)、\(\text{next}\) 复制 \(\text q\) 的,\(\text{len(copy)} \gets \text{len(p) + 1}\),\(\text{link(q)} \gets \text{copy}\), \(\text{link(cur)} \gets \text{copy}\).
  7. 遍历 \(\text p\) 开始的后缀链接,若 \(\text p\) 有 \(\text c\) 边 \(\text p\to\text q\),则重定向到 \(\text{copy}\),直到没有 \(\text c\) 边或连向的非 \(\text q\),转 8.
  8. \(\text{last} \gets \text{cur}\). (转 1)

解析(极速版):(记 \(\text{short(q)}\) 为 \(\text q\) 最短的,\(\text{long(q)}\) 为 \(\text q\) 最长的)我们新建了一个等价类 \(\text{cur}\),前三步可以理解.

第 4 步是找到了当前一个后缀在前面的一个出现 \(\text q\). 这样,这个后缀的 \(\text{endpos}\) 真包含了 \(\text{cur}\) 的 \(\text{endpos}\)(我们找到了一个可以 \(\text{link}\) 的串). 这样,我们想要 \(\text{cur}\) \(\text{link}\) 向 \(\text q\),只需要一个条件:这个后缀是 \(\text q\) 中最长的串. 于是,若 \(\text{len(p) + 1 = len(q)}\),它就显然满足了,可以直接连。

否则它不满足、不能直接连,那我们需要构造一个新等价类,使得它的最长串是这个后缀。然后的大概思路是构造一个 \(\text{copy}\),把 \(\text q\) 分成新 \(\text q\) 和 \(\text{copy}\) 两份,那现在考虑分裂 \(\text q\) 的影响.

画画图容易看出,\(\text{link(q)}\) 应连向 \(\text{copy}\),而 \(\text{link(copy)}\) 应该继承之前的 \(\text{link(q)}\),而显然 \(\text{len(copy) = len(p) + 1}\),\(\text{link(cur)}\) 指向 \(\text{copy}\),而原来 \(\text q\) 能下一位走哪些字符,\(\text{copy}\) 当然也可以,故复制之前 \(\text q\) 的所有出边. 这样就有了第 6 步.

什么?你不会画图?那我找个链接吧:/i/l/?n=20&i=blog/1924188/202110/1924188-20211018091040410-273570033.png

这样 \(\text{copy}\) 我们就安排完了,除此之外,我们还要重定向一些出边. 那么从 \(\text p\) 继续遍历后缀链接,由于是从 \(\text p\) 开始遍历后缀,所以若有 \(\text c\) 出边那一定连向 \(\text{copy}\),剩下的一定还是连向 \(\text q\). 而若出边 \(\text c\) 指向的不是 \(\text q\)(或没有出边 \(\text c\))了,那说明遍历到比 \(\text{short(q)}\) 还短的后缀了,该后缀不应指向 \(\text{copy}\),就说明应重定向的边已全定完。退出即可.

第 8 步没什么好讲的.

懂穿了吧 !!!

其他一些性质:

  • 点数 \(2n-1 (\texttt{abbb..b})\),边数 \(3n-4 (\texttt{abbb..bc})\),时 \(O(n)\),空 \(O(n|\Sigma|)\)(map:\(O(n\log|\Sigma|)\))
  • 后缀链接树:祖先是它的后缀;\(S_{1..p}\),\(S_{1..q}\) 的最长公共后缀就是 \(\text{LCA}(\text{v}_{\text{p}},\text{v}_{\text q})\) 对应的串,其中 \(\text{v}_{\text{p}}\) 为位置 \(\text p\) 对应的终点节点;这棵树就是反串的压缩后缀树;每个状态 \(i\) 对应的子串数量为 \(\text{len}(i)-\text{len}(\text{link}(i))\)(显然,但 0 除外),...

分配结束标记:从 \(\text{last}\) 开始跳,标记这些点.

每次加入新字符产生的新子串数目(本质不同):\(\text{len(cur)-len(link(cur))}\).

完结撒花~~

有人问我为什么不加 LaTeX,因为我懒。

UPD:已添加 LaTeX.

标签:cur,SAM,后缀,text,len,link,笔记,copy
From: https://www.cnblogs.com/laijinyi/p/18276869/SAM

相关文章

  • 【操作系统期末速成】 EP03 | 学习笔记(基于五道口一只鸭)
    文章目录一、前言......
  • vlc play video shared by samba
    Nottoresurrectanoldthread,butifanyonehasthissameissueandwaswondering,youcanmakeitworkbyfollowingthesedirections:http://jorisvandijk.com/2013/vlc-wont-play-smb-shares/Summary:OpenVLCGotoTools>PreferencesUndertheheaderS......
  • LVGL快速入门笔记
    目录一、基础知识1.基础对象(lv_obj)2.基础对象的大小(size)3.基础对象的位置(position)3.1直接设置方式3.2参照父对象对齐3.3获取位置4.基础对象的盒子模型(border-box)5.基础对象的样式(styles)5.1样式的状态和部分5.1.1对象可以处于以下状态States的组合......
  • linux笔记10--编辑器之神VIM
    文章目录1.简单介绍①为什么叫vim②linux常见的编辑器③注意事项④其它2.操作模式的划分①两种--国际上普通模式(命令操作模式)插入模式②三种--国内普通模式如何进入与退出界面插入模式如何进入与退出界面命令模式如何进入与退出界面常见的命令模式③......
  • PADS进行PCB设计学习笔记
    我们在Cadence里面绘制完原理图时,打开PADSLOGIC软件,导入原理图,然后链接到PCB中,可以实现交互式设计,有利于各个模块的布局。在进行PCB设计之前,需要先进行一些设置。设置板框选中板框在特性里直接设置板框(板框在所有层都有)要在板子上挖洞直接选中特性里面设置板框挖空区。元......
  • Prompt4NR论文阅读笔记
    PromptLearningforNewsRecommendation论文阅读笔记Abstract​ 最近的一些新闻推荐(NR)方法引入了预训练语言模型(PLM),通过精心设计的推荐专用神经网络和目标函数,遵循虚构的预训练和微调范式来编码新闻表征。由于任务目标与PLM的任务目标不一致,我们认为他们的建模范式没有很好......
  • 2024/06/24笔记随笔
    网格布局创建简易计算器publicclassCalculatorDemoextendsApplication{privatedoublenumber1=0;privateStringoperator="";privatebooleanstart=true;@Overridepublicvoidstart(Stagestage)throwsException{stage.......
  • 如何使用JMeter 中beanshell sample实现 POST 请求并处理响应
    如何使用JMeter中beanshellsample实现POST请求并处理响应在JMeter的性能测试中,可以通过Java代码来实现复杂的POST请求并处理响应。以下是一个详细的示例代码解析:importjava.io.OutputStreamWriter;importjava.io.InputStreamReader;importjava.io.BufferedReade......
  • 虚树初步学习笔记
    虚树给定一棵树,树上有一些关键点,你要建另一棵树,保留关键点,以及任意一对关键点的\(\text{LCA}\)。当你发现对于一棵树,你只有一些关键点有用的时候,就可以尝试建虚树。两次排序思路先把所有点按\(\text{dfn}\)序排序,然后把\(\text{dfn}\)相邻的两个点取出来,再把它们的\(\t......
  • UaG论文阅读笔记
    User-as-Graph:UserModelingwithHeterogeneousGraphPoolingforNewsRecommendation论文阅读笔记Abstract现存的问题​ 现有的新闻推荐方法通常通过顺序模型或关注模型从用户行为中建立用户兴趣模型。然而,它们无法对用户行为之间的丰富关联性进行建模,而这种关联性可以为......