[OI笔记]后缀自动机
本来没打算写的,不过想想看后缀自动机的理论看了两三天了才有点懂(我太傻了)…下周期末考的话大概要去复习一下文化课感觉回来又要忘得差不多,还是开篇blog记一下好了。
相关的资料:
cls当年的课件:2012年noi冬令营陈立杰讲稿
一篇不错的blog:http://www.cnblogs.com/meowww/p/6394960.html
因为博主比较懒(菜)所以这里就大概记一些关键的东西(其实也就只复述了一遍建SAM的过程,大概在cls课件40页左右的地方)。
用$p$表示$p=ST(T)$且$Right(p)=\{Lenght+1\}$的点(代码里用$last$记录),对于字符串$T$的SAM,我们在后面加入一个新的字符$x$,新建$np=ST(Tx),val[np]=val[p]+1$,对$p$所有没有$x$标号的祖先$v$,令$tr[v][x]=np$,也就是连向我们新加的点。
就这样找到第一个有$x$标号的祖先$v_p$,这里有几种情况。如果没有找到这样的$v_p$直接令$suf[np]=root$(根作为$np$的父亲),然后就可以结束了。否则令$q=tr[v_p][x]$,这时候如果$val[v_p]+1=val[q]$的话直接让$suf[np]=q$然后结束,但是如果不行的话就有点麻烦了,这时候我们要再建一个点$nq:tr[nq][*]=tr[q][*]$,然后$suf[nq]=suf[q],suf[q]=suf[np]=nq$,最后对所有$tr[v][x]==q$的祖先$v$都改成$tr[v][x]=nq$。
最后当然不要忘记更新$last$。
构造大概就是这样子啦。
inline int newNode(int x)
{
val[++cnt]=x;return cnt;
}
inline void insert(int x)
{
int p=last,np=newNode(val[p]+1);memset(tr[np],0,sizeof tr[np]);
while(p&&!tr[p][x])tr[p][x]=np,p=suf[p];
if(!p)suf[np]=1;
else
{
int q=tr[p][x];
if(val[q]==val[p]+1)suf[np]=q;
else
{
int nq=newNode(val[p]+1);
memcpy(tr[nq],tr[q],sizeof tr[nq]);
suf[nq]=suf[q];suf[np]=suf[q]=nq;
while(p&&tr[p][x]==q)tr[p][x]=nq,p=suf[p];
}
}
last=np;
}
写起来还是挺短的
[OI笔记]后缀自动机的更多相关文章
- [学习笔记]后缀自动机SAM
好抽象啊,早上看了两个多小时才看懂,\(\%\%\%Fading\) 早就懂了 讲解就算了吧--可以去看看其他人的博客 1.[模板]后缀自动机 \(siz\) 为该串出现的次数,\(l\) 为子串长度 ...
- [笔记] 后缀自动机 (SAM)
实现 void ins(int c){ int np = ++dcnt, p = lst; lst = np; t[np].len = t[p].len + 1, t[np].eps = 1; whi ...
- 后缀自动机&回文自动机学习笔记
在学了一天其实是边学边摆之后我终于大概$get$后缀自动机了,,,就很感动,于是时隔多年我终于决定再写篇学习笔记辽$QwQ$ $umm$和$FFT$学习笔记一样,这是一篇单纯的$gql$的知识总结博, ...
- 后缀自动机(SAM)学习笔记
目录 定义 SAM 的状态集 一些性质 SAM 的后缀链接 SAM 的转移函数 一些性质 算法构造 构造方法 时间复杂度证明 状态的数量 转移的数量 代码实现 实际应用 统计本质不同的子串个数 计算任 ...
- 【文文殿下】后缀自动机(Suffix Automaton,SAM)学习笔记
前言 后缀自动机是一个强大的数据结构,能够解决很多字符串相关的(String-related)问题. 例如:他可以查询一个字符串在另一个字符串中出现的所有子串,以及查询一个字符串中本质不同的字符串的个 ...
- 后缀自动机SAM学习笔记
前言(2019.1.6) 已经是二周目了呢... 之前还是有一些东西没有理解到位 重新写一下吧 后缀自动机的一些基本概念 参考资料和例子 from hihocoder DZYO神仙翻译的神仙论文 简而 ...
- 后缀自动机(SAM) 学习笔记
最近学了SAM已经SAM的比较简单的应用,SAM确实不好理解呀,记录一下. 这里提一下后缀自动机比较重要的性质: 1,SAM的点数和边数都是O(n)级别的,但是空间开两倍. 2,SAM每个结点代表一个 ...
- 【学习笔记】浅析后缀自动机(SAM)及基础应用
解决子串相关问题的强大工具 我们知道一个长度为 \(n\) 的字符串中所有的子串数目为 \(O(n^2)\) 个,这很大程度上限制了我们对某些子串相关问题的研究.所以有没有解决方案,使得我们可以在可承 ...
- BZOJ 3277 串 (广义后缀自动机)
3277: 串 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 309 Solved: 118 [Submit][Status][Discuss] De ...
随机推荐
- HarmonyOS Java UI之StackLayout布局示例
StackLayout简介 StackLayout意为堆叠布局,用于在屏幕上保留一个区域来显示组件,实现特殊的功能.通常,堆叠布局中只应该放置一个子组件,如果存在多个子组件,则显示最新的组件.这个布局 ...
- 硕思logo设计师注册码去哪里找,文末附链接
硕思logo设计师注册码去哪里找呢?当然是硕思logo设计师官网啦! 最近小编总是会被网友们咨询关于logo设计的问题,其中很多网友并不是专业的设计人员,特别是一些设计公司面对新手设计时,往往会不知所 ...
- ABBYY FineReader 15 新增编辑表格单元格功能
ABBYY FineReader 15(Windows系统)新增编辑表格单元格功能,在PDF文档存在表格的前提下,可将表中的每个单元格作为单独的文字块进行单独编辑,单元格内的编辑不会影响同一行中其他单 ...
- 苹果电脑怎么给浏览器安装Folx扩展程序
Folx是一款MacOS专用的老牌综合下载管理软件,它的软件界面简洁,应用简单方便,下载管理及软件设置灵活而强大.Folx不但能够进行页面链接下载.Youtube视频下载,而且还是专业的BT下载工具. ...
- 详解pdfFactory的页面管理功能
当我们将文档载入到pdfFactory 之后才发现文档中存在着一些乱页现象.那么是否需要重新整理文档后,再重新载入到软件中呢?实际上,不需要. pdfFactory专业版提供了高效的页面管理功能,用户 ...
- 唯一key的生成规则,可自己视情况改动
<?php function getMillisecond() { $time = explode ( " ", microtime ()); $time = $time[1 ...
- shipyard中文版安装教程(附安装脚本)
一. Docker Shipyard是什么 ? shipyard是一个开源的docker管理平台,其特性主要包括: 支持节点动态集群,可扩展节点的规模(swarm.etcd方案) 支持镜像管理.容器管 ...
- 关于Jersey框架下的Aop日志 和Spring 框架下的Aop日志
摘要 最近新接手的项目经常要查问题,但是,前面一拨人,日志打的非常乱,好多就根本没有打日志,所以弄一个AOP统一打印一下 请求数据和响应数据 框架 spring+springmvc+jersey 正文 ...
- MySql学习笔记--详细整理--上
目录 MySql MySql安装 连接数据库 操作数据库 数据库的列类型 数据库的字段属性 创建数据库 修改删除表 数据管理 外键 DML语言 添加 修改 删除 DQL查询数据(重点) 查询 去重 w ...
- 分布式计算框架-MapReduce 基本原理(MP用于分布式计算)
hadoop最主要的2个基本的内容要了解.上次了解了一下HDFS,本章节主要是了解了MapReduce的一些基本原理. MapReduce文件系统:它是一种编程模型,用于大规模数据集(大于1TB)的并 ...