形势所迫,一个对字符串深恶痛绝的鸽子又来更新了。

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自动机复习的更多相关文章

  1. 学习笔记::AC自动机

    最先开始以为和自动刷题机是一个东西... 其实就是kmp的一个拓展.学完kmp再学这个就会发现其实不难 1.kmp是一个串匹配一个串,但是当我们想用多个串匹配一个文本的时候,kmp就不行了,因此我们有 ...

  2. [一本通学习笔记] AC自动机

    AC自动机可以看作是在Trie树上建立了fail指针,在这里可以看作fail链.如果u的fail链指向v,那么v的对应串一定是u对应串在所给定字符串集合的后缀集合中的最长的后缀. 我们考虑一下如何实现 ...

  3. SAM学习笔记

    SAM学习笔记 后缀自动机(模板)NSUBSTR(Caioj1471 || SPOJ 8222) [题意] 给出一个字符串S(S<=250000),令F(x)表示S的所有长度为x的子串中,出现次 ...

  4. mybatis学习笔记之基础复习(3)

    mybatis学习笔记之基础复习(3) mybatis是什么? mybatis是一个持久层框架,mybatis是一个不完全的ORM框架.sql语句需要程序员自己编写, 但是mybatis也是有映射(输 ...

  5. 后缀自动机(SAM) 学习笔记

    最近学了SAM已经SAM的比较简单的应用,SAM确实不好理解呀,记录一下. 这里提一下后缀自动机比较重要的性质: 1,SAM的点数和边数都是O(n)级别的,但是空间开两倍. 2,SAM每个结点代表一个 ...

  6. 后缀自动机SAM学习笔记

    前言(2019.1.6) 已经是二周目了呢... 之前还是有一些东西没有理解到位 重新写一下吧 后缀自动机的一些基本概念 参考资料和例子 from hihocoder DZYO神仙翻译的神仙论文 简而 ...

  7. 【文文殿下】后缀自动机(Suffix Automaton,SAM)学习笔记

    前言 后缀自动机是一个强大的数据结构,能够解决很多字符串相关的(String-related)问题. 例如:他可以查询一个字符串在另一个字符串中出现的所有子串,以及查询一个字符串中本质不同的字符串的个 ...

  8. [学习笔记]后缀自动机SAM

    好抽象啊,早上看了两个多小时才看懂,\(\%\%\%Fading\) 早就懂了 讲解就算了吧--可以去看看其他人的博客 1.[模板]后缀自动机 \(siz\) 为该串出现的次数,\(l\) 为子串长度 ...

  9. HQYJ嵌入式学习笔记——C语言复习day1

    第一天:Linux命令 vim操作 第二天:数据类型 运算符 顺序语句第三天:分支语句 循环语句第四天:循环语句 数组第五天:数组第六天:指针第七天:函数 数组与指针第八天:数组指针第九天:递归 第十 ...

随机推荐

  1. 结合实体框架(代码优先)、工作单元测试、Web API、ASP. net等,以存储库设计模式开发示例项目。NET MVC 5和引导

    介绍 这篇文章将帮助你理解在库模式.实体框架.Web API.SQL Server 2012.ASP中的工作单元测试的帮助下设计一个项目.净MVC应用程序.我们正在开发一个图书实体和作者专用的样例图书 ...

  2. linux 中 eclipse 开发 c/c++ 多线程程序,添加 libpthread.a 库支持

    导入头文件 在 linux 中开发多线程程序,在使用到 pthread 系列函数的文件中,需要导入头文件: #include <pthread.h> 链接 libpthread.a 在编译 ...

  3. PHP的学习(提前学习了,业余爱好) (一)

    一个函数一个函数地堆 strstr()函数 在本地测试的时候,代码与显示如下 1.代码: <?php echo strstr("I love Shanghai!123",&q ...

  4. 一个故事看懂AI神经网络工作原理

    我是一个AI神经元 我是一个AI神经元,刚刚来到这个世界上,一切对我来说都特别新奇. 之所以叫这个名字,是因为我的工作有点像人类身体中的神经元. 人体中的神经元可以传递生物信号,给它输入一个信号,它经 ...

  5. 多测试_mysql数据库_09

    什么是数据库? 是存放数据的电子仓库.以某种方式存储百万条,上亿条数据,供多个用户访问共享. 每个数据库都有一个或多个不同的api用于创建.访问,管理和复制所保存的数据. 数据库分关系型数据库和非关系 ...

  6. MeteoInfoLab脚本示例:CloudSAT Swath HDF数据

    读取CloudSAT HDF Swath数据,绘图分上下两部分,上面是时间和高度维的Radar Reflectivity Factor二维图,下面是卫星轨迹图.示例程序: # Add file f = ...

  7. MeteoInfoLab脚本示例:利用比湿、温度计算相对湿度

    利用比湿和温度计算相对湿度的函数是qair2rh(qair, temp, press=1013.25),三个参数分别是比湿.温度和气压,气压有一个缺省值1013.25,因此计算地面相对湿度的时候也可以 ...

  8. day48 Pyhton 数据库Mysql 05

    一内容回顾 insert insert into 表名 (字段名)  values (值) insert into 表名 values (有多少个字段写多少个值) insert into 表名 val ...

  9. redhat系统服务器重启后提示An error occurred during the file system check.

    问题描述 浪潮一台NF8480M3外观红灯报警,鉴于无法登陆带外,只能对服务器进行断电重启操作 问题现象 重启后进入开机过程并报错,报错如下内容及图片如下所示,正常来说进入此界面后直接输入root密码 ...

  10. 跟我一起学Redis之看完这篇比常人多会三种类型实战(又搞了几个小时)

    前言 对于Redis而言,很多小伙伴只关注其关键的五大基础类型:string.hash.list.set.sorted set(有序集合),其实还有三种特殊类型在很多应用场景也比较适合使用,分别是:b ...