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操作 第二天:数据类型 运算符 顺序语句第三天:分支语句 循环语句第四天:循环语句 数组第五天:数组第六天:指针第七天:函数 数组与指针第八天:数组指针第九天:递归 第十 ...
随机推荐
- 64位Win7下H3C的iMC无法查看“网络拓扑”的解决方法、心路历程
64位Win7下H3C的iMC无法查看"网络拓扑"的解决方法.心路历程
- 【题解】[USACO07OPEN]Dining G
\(Link\) \(\text{Solution:}\) 这一题,我们要做到,食物和牛.牛和饮料均为一对一的关系.我们发现这个图不好建立. 经典技巧:将牛拆边,拆成入点和出点,并连容量为\(1\)的 ...
- JVM垃圾回收的基础知识
什么是垃圾? 没有任何引用指向的对象,就是垃圾 如何找到垃圾?(2 种方法) 过程:先找到正在使用的对象,然后把没有正在使用的对象进行回收 1.引用数-Reference-Count 被引用数为 0 ...
- 零基础小白Python入门必看:面向对象之典型魔术方法
- Vue结合Django-Rest-Frameword结合实现登录认证(二)
作者:小土豆biubiubiu 博客园:https://www.cnblogs.com/HouJiao/ 掘金:https://juejin.im/user/2436173500265335 微信公众 ...
- shell-变量输入内置read命令详解
1. shell变量的输入 shell变量除了可以直接赋值或脚本传参外,还可以使用read命令从标准输入得. [语法格式] read [参数] [变量名] [常用参数] -p:指定读取值时的提示符: ...
- map的key排序
java map的key排序吗 java为数据结构中的映射定义了一个接口java.util.Map,他实现了四个类,分别是:HashMap,HashTable,LinkedHashMapTreeMap ...
- spring boot:spring security给用户登录增加自动登录及图形验证码功能(spring boot 2.3.1)
一,图形验证码的用途? 1,什么是图形验证码? 验证码(CAPTCHA)是"Completely Automated Public Turing test to tell Computers ...
- spring boot:解决cors跨域问题的两种方法(spring boot 2.3.2)
一,什么是CORS? 1,CORS(跨域资源共享)(CORS,Cross-origin resource sharing), 它是一个 W3C 标准中浏览器技术的规范, 它允许浏览器向非同一个域的服务 ...
- centos8平台yum无法安装一些常用软件的解决,如:screen,iftop,nethogs
一,例如:安装screen时报错: [root@localhost liuhongdi]# yum install screen 上次元数据过期检查:17:39:58 前,执行于 2020年03月18 ...