SAM学习笔记&AC自动机复习
形势所迫,一个对字符串深恶痛绝的鸽子又来更新了。
SAM
后缀自动机就是一个对于字符串所有后缀所建立起的自动机。一些优良的性质可以使其完成很多字符串的问题。
其核心主要在于每个节点的状态和$endpos$这个概念的结合:“状态”定义为从源点出发到达当前节点的所有字符串,$endpos$对于一个字符串它作为整个字符串子串的末尾的集合,而SAM则保证状态和相同的$endpos$集合构成一个一一映射。
容易证明在同一个状态的字符串互为后缀,记最长的那个为$longest(x)$,但是不保证所有同后缀的字符串都是同一个状态,所以我们从一个状态连到前面的一个状态,记连边为$link$,表示被连的那个状态$endpos$比当前这个多。这样的边构成的DAG称之为$parent tree$,容易发现,被连状态的$longest(x)$为连向它的状态的$longest(x)$的后缀。
接下来考虑如何建立SAM,考虑一个一个加进字符,在$X$后加入$S$,我们分三类讨论:
1.记在$parent tree$跳到的节点为$p$,如果$p$没有向$S$连的边,那么直接连边即可。
2.$p$有向$S$连的边,而且$longest(p)+1=longest(p+S)$,那么就说明第一个$p+S$是对于新加入节点第一个$endpos$产生分裂的地方,那么$link[X+S]=p+S$
3.最烦的情况:即连出去的那条边是“飞出去的”

考虑从这个性质,因为从X连到P,所以从起点连到P的$longest$一定是X的后缀,而P的转移边是到T,所以$longest(P+S)$必然在$T$中作为一个后缀。
所以在加上S以后T中的一个后缀(不是T且现在无法表示出,但是必然在字符串中)和X+S不再属于同一个$endpos$,这是第一个断点。所以要从中间截取出一个作为新的状态,$longest$长度应当是$longest(P)+1$。(这个节点也是T的第一个断点)
即:
拆分出$y$,使得$trans[p...w]=y$($w$是最后一个$trans[w]=T$),然后$y$继承$x$,$link[y]=link[T]$,$link[T]=link[X+S]=y$
代码:
struct SAM{
int link[N],maxlen[N],trans[N][26],f[N];
void extend(int id){
int cur=++sz,p; f[sz]=1;
maxlen[cur]=maxlen[lst]+1;
for(p=lst;p&&!trans[p][id];p=link[p]) trans[p][id]=cur;
if(!p) link[cur]=1;
else{
int q=trans[p][id];
if(maxlen[q]==maxlen[p]+1) link[cur]=q;
else{
int tmp=++sz;
maxlen[tmp]=maxlen[p]+1;
copy(trans[q],trans[q]+26,trans[tmp]);
link[tmp]=link[q];
for(;p&&trans[p][id]==q;p=link[p]) trans[p][id]=tmp;
link[cur]=link[q]=tmp;
}
}
lst=cur;
}
}tree;
目前只会板子这种,联赛以后再填坑。
SAM学习笔记&AC自动机复习的更多相关文章
- 学习笔记::AC自动机
最先开始以为和自动刷题机是一个东西... 其实就是kmp的一个拓展.学完kmp再学这个就会发现其实不难 1.kmp是一个串匹配一个串,但是当我们想用多个串匹配一个文本的时候,kmp就不行了,因此我们有 ...
- [一本通学习笔记] AC自动机
AC自动机可以看作是在Trie树上建立了fail指针,在这里可以看作fail链.如果u的fail链指向v,那么v的对应串一定是u对应串在所给定字符串集合的后缀集合中的最长的后缀. 我们考虑一下如何实现 ...
- SAM学习笔记
SAM学习笔记 后缀自动机(模板)NSUBSTR(Caioj1471 || SPOJ 8222) [题意] 给出一个字符串S(S<=250000),令F(x)表示S的所有长度为x的子串中,出现次 ...
- mybatis学习笔记之基础复习(3)
mybatis学习笔记之基础复习(3) mybatis是什么? mybatis是一个持久层框架,mybatis是一个不完全的ORM框架.sql语句需要程序员自己编写, 但是mybatis也是有映射(输 ...
- 后缀自动机(SAM) 学习笔记
最近学了SAM已经SAM的比较简单的应用,SAM确实不好理解呀,记录一下. 这里提一下后缀自动机比较重要的性质: 1,SAM的点数和边数都是O(n)级别的,但是空间开两倍. 2,SAM每个结点代表一个 ...
- 后缀自动机SAM学习笔记
前言(2019.1.6) 已经是二周目了呢... 之前还是有一些东西没有理解到位 重新写一下吧 后缀自动机的一些基本概念 参考资料和例子 from hihocoder DZYO神仙翻译的神仙论文 简而 ...
- 【文文殿下】后缀自动机(Suffix Automaton,SAM)学习笔记
前言 后缀自动机是一个强大的数据结构,能够解决很多字符串相关的(String-related)问题. 例如:他可以查询一个字符串在另一个字符串中出现的所有子串,以及查询一个字符串中本质不同的字符串的个 ...
- [学习笔记]后缀自动机SAM
好抽象啊,早上看了两个多小时才看懂,\(\%\%\%Fading\) 早就懂了 讲解就算了吧--可以去看看其他人的博客 1.[模板]后缀自动机 \(siz\) 为该串出现的次数,\(l\) 为子串长度 ...
- HQYJ嵌入式学习笔记——C语言复习day1
第一天:Linux命令 vim操作 第二天:数据类型 运算符 顺序语句第三天:分支语句 循环语句第四天:循环语句 数组第五天:数组第六天:指针第七天:函数 数组与指针第八天:数组指针第九天:递归 第十 ...
随机推荐
- 034 01 Android 零基础入门 01 Java基础语法 04 Java流程控制之选择结构 01 流程控制概述
034 01 Android 零基础入门 01 Java基础语法 04 Java流程控制之选择结构 01 流程控制概述 本文知识点:Java中的流程控制相关概念的认识 三大流程控制语句结构的简介 顺序 ...
- centos配置WordPress(Apache+mysql+php)
.安装Apache 安装命令:sudo yum install httpd 启动服务:sudo service httpd start 在浏览器输入IP地址,正常应该显示Apache的欢迎页面 如果提 ...
- windows 漏洞列表
漏洞列表 #Security Bulletin #KB #Description #Operating System CVE-2017-0213 [Windows COM Eleva ...
- 【转载】绕过CDN找到源站的思路
[原文:https://mp.weixin.qq.com/s/8NUvPqEzVjO3XbmCBukUvQ] 绕过CDN的思路 网上有很多绕过CDN的思路,但是存在很多问题,以下是收集并总结的思路.站 ...
- 在uniapp或者vue中单行文字或者符号无法换行的终极解决方案
在VUE开发过程中,会出现比较诡异的情况. 比如常规的英文或中文显示都是很正常的,但是当出现了一些中文符号(比如,!等等)在文末的时候,总是会超出view的显示区域. 那么在遇到上面这种问题我们记得检 ...
- 在Windows7中打开照片,提示“Windows 照片查看器无法显示此图片,因为计算机上的可用内存可能不足。....”
在Windows7中打开照片,提示"Windows 照片查看器无法显示此图片,因为计算机上的可用内存可能不足.请关闭一些目前没有使用的程序或者释放部分硬盘空间(如果硬盘几乎已满),然后重试. ...
- mPDF的简单使用
1. 基本使用 安装 1 在项目下composer文件中 添加 "mpdf/mpdf":"~7.1.9" 测试环境为Yii项目 其他框架composer安装大 ...
- 多测师讲解python_oo1基本操作
1.什么是Python? Python是一门面向对象,解释型的动态类型的编程语言,有Guido van Rossunm于1989年发明,第一个公开发行版发行于1991年: Guido van Ross ...
- go-zero 如何应对海量定时/延迟任务?
一个系统中存在着大量的调度任务,同时调度任务存在时间的滞后性,而大量的调度任务如果每一个都使用自己的调度器来管理任务的生命周期的话,浪费cpu的资源而且很低效. 本文来介绍 go-zero 中 延迟操 ...
- day60 Pyhton 框架Django 03
day61 内容回顾 1.安装 1. 命令行: pip install django==1.11.18 pip install django==1.11.18 -i 源 2. pycharm sett ...