SAM(后缀自动机)总结
“写sam是肯定会去写的,这样才学的了字符串,后缀数组又不会用 >ω<,
sam套上数据结构的感觉就像回家一样!
里面又能剖分又能线段树合并,调试又好调,我爱死这种写法了 !qwq”
SAM是一个DFA,它存储了某字符串的所有子串信息。
待更。
博主水平不行,尽量在退役前多更些。
插入字符:
void extend(int id,int&now)
{
int p=now;
if(ch[p][id] && len[ch[p][id]]==len[p]+)
{
now=ch[p][id];
return;
}
int np=++tot;
len[np]=len[p]+;
while(p && !ch[p][id])
{
ch[p][id]=np;
p=fa[p];
}
if(!p)
{
fa[np]=;
}
else
{
int q=ch[p][id];
if(len[q]==len[p]+)
{
fa[np]=q;
}
else
{
int nq=++tot;
len[nq]=len[p]+;
fa[nq]=fa[q];
for(int i=;i<;i++)
ch[nq][i]=ch[q][i];
fa[q]=fa[np]=nq;
while(p && ch[p][id]==q)
{
ch[p][id]=nq;
p=fa[p];
}
}
}
now=np;
}
套路:
每条路径与子串一一对应。
$len_i$:该节点最长串的长度
$Parent Tree$上的子树和:串的出现次数
$len_i - len_{fa_i}$:该节点代表的串的数目
部分题目选:
(1)[SAM入门题][NOI2018]你的名字
线段树合并维护$right$集合
(2)[SAM入门题][CTSC2012]熟悉的文章
$SAM$只是用来预处理的,求答案还要靠二分+单队$DP$
(3)[SAM入门题][bzoj2555]Substring
$LCT$对$Parent Tree$结构的维护
(4)[bzoj3277]字符串
广义后缀自动机的应用
暴力搞复杂度大概是根号的,不会证明。
(5)[bzoj5084]HASHIT
带撤销后缀自动机,随机数据随便艹。
upd:BFS建树形后缀树以后再进行DFS+树链求并统计答案就行了。
(6)[USACO]牛奶模式
后缀自动机的基本原理与使用
(7)[洛谷元旦赛]WD与数列
维护$right$集合的好题(似乎还要在parent树上跑启发式合并计算贡献,我并不会)
现在可能会了。
(8)[FZOJ2258]封印
校内题目,没连接
大概就是你知道$Parent$树是干啥的,形态如何,就能直接切掉。
(9)[TJOI2016]字符串
考虑求出 sam 上一个串 p 在 [l,r] 里出现的次数,这个可以通过数一数 p 的 right 集合里有多少在 $[l+len_p-1,r]$ 中出现。
lcp 可以二分,倍增可以从区间 locate 子串,那么这个题就 $O(n\log^2 n)$ 了。
upd:话说为啥没见过把状态设在sam节点上的DP题?
upd:CF700E,已经单独更新
(10)[十二省联考]字符串问题
题目意思大概是描述给你一个连边关系,求 DAG 上最长路。
直接暴力构图可以 $n^2$ ,用 hash 判断。
如果考虑建后缀树,那么在一个节点上有短->长的后缀关系,另外父子关系也是后缀关系,拆点据此连边即可。
只需要实现对区间 locate 子串即可,时间复杂度 $O(n\log n)$。
SAM(后缀自动机)总结的更多相关文章
- Distinct Substrings(spoj694)(sam(后缀自动机)||sa(后缀数组))
Given a string, we need to find the total number of its distinct substrings. Input \(T-\) number of ...
- 弦论(tjoi2015,bzoj3998)(sam(后缀自动机))
对于一个给定长度为\(N\)的字符串,求它的第\(K\)小子串是什么. Input 第一行是一个仅由小写英文字母构成的字符串\(S\) 第二行为两个整数\(T\)和\(K\),\(T\)为0则表示不同 ...
- LCS2 - Longest Common Substring II(spoj1812)(sam(后缀自动机)+多串LCS)
A string is finite sequence of characters over a non-empty finite set \(\sum\). In this problem, \(\ ...
- LCS - Longest Common Substring(spoj1811) (sam(后缀自动机)+LCS)
A string is finite sequence of characters over a non-empty finite set \(\sum\). In this problem, \(\ ...
- Lexicographical Substring Search (spoj7259) (sam(后缀自动机)+第k小子串)
Little Daniel loves to play with strings! He always finds different ways to have fun with strings! K ...
- Substrings(SPOJ8222) (sam(后缀自动机))
You are given a string \(S\) which consists of 250000 lowercase latin letters at most. We define \(F ...
- sam(后缀自动机)
后缀自动机ins解释 void ins(int c){ int p=last;//将当前节点的parent节点变为last int np=++cnt;//建立新节点 last=np;//将last设为 ...
- Luogu P3346 [ZJOI2015]诸神眷顾的幻想乡 广义SAM 后缀自动机
题目链接 \(Click\) \(Here\) 真的是好题啊-不过在说做法之前先强调几个自己总是掉的坑点. 更新节点永远记不住往上跳\(p = fa[p]\) 新建节点永远记不住\(len[y] = ...
- 字符串(tjoi2016,heoi2016,bzoj4556)(sam(后缀自动机)+线段树合并+倍增+二分答案)
佳媛姐姐过生日的时候,她的小伙伴从某东上买了一个生日礼物.生日礼物放在一个神奇的箱子中.箱子外边写了 一个长为\(n\)的字符串\(s\),和\(m\)个问题.佳媛姐姐必须正确回答这\(m\)个问题, ...
- 后缀自动机SAM学习笔记
前言(2019.1.6) 已经是二周目了呢... 之前还是有一些东西没有理解到位 重新写一下吧 后缀自动机的一些基本概念 参考资料和例子 from hihocoder DZYO神仙翻译的神仙论文 简而 ...
随机推荐
- 移动端CSS重置
移动端 CSS Reset 该怎么写 为了应对各大浏览器厂商对浏览器默认样式的不统一处理,我们往往会进行一个 css reset 操作,由于没有标准而且受个人偏好影响,每个公司实现的都不尽相同.关于 ...
- thinkphp的where 之 or的使用
需要生成 SELECT * FROM `goods` WHERE ( `goodstype_id` = 2 or `goodstype_id` = 3 ) $where['goodstype_id'] ...
- 线性筛-prime,强大O(n)
和朴素的素数筛法一样,flag数组,记录x是否为素数 flag[x]=0,x为合数 falg[x]=1,x为素数 flag[1],无定义 其核心思想是,用x筛除与之差异最小的y,达到时间上O(n)的目 ...
- opencv:图像边缘发现
拉普拉斯算子 Mat dst; // ksize 3 ,必须是奇数,不同大小会有不同的效果 Laplacian(src, dst, -1, 3, 1.0, 0, BORDER_DEFAULT); im ...
- php 填写pdf 表单
最近接到新的任务,要求把pdf的文档,编辑后发邮件 首先pdf表单提交,需要用到这个东西pdftk,GitHub地址:https://github.com/mikehaertl/php-pdftk 首 ...
- 10day rpm简单用法qa ql qf "`"用法
查看软件是否安装: [root@oldboyedu ~]# rpm -qa sl -q表示查询 -a表示所有 sl-5.02-1.el7.x86_64 查看软件包中有哪些信息 [root@oldboy ...
- Linux - bash - 小坑: IFS
1. 概述 for 循环读取文件内容时, 输出被打得稀碎 2. 场景 需求 读入文件 逐行显示 源文件 Continuous Delivery with Docker and Jenkins Jenk ...
- py2
函数相关的 # 生成器相关的# 例1 ll = sum(i for i in range(100000000)) #生成器占资源少 # 例2 def demo(): for i in range(4) ...
- P & R 8
Floorplan: 要做好floorplan需要掌握哪些知识跟技能? 通常,遇到floorplan问题,大致的debug步骤跟方法有哪些? 如何衡量floorplan的QA? T:Block lev ...
- 初始css一
初始CSS 一.form表单补充 form表单关键性的属性补充 form表单 关键性的属性 action 控制的是数据的提交路径 1.不写 默认是朝着当前页面所在的地址提交 2.全路径 3.后缀(/i ...