![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
后缀自动机
WerKeyTom_FTD
我是一只来自中山纪念中学高三的oier,请多多指教
展开
-
后缀自动机复习小记
前言为什么叫复习小记?因为之前学的时候没有完全理解QAQ。什么是SAMSAM就是后缀自动机,它满足以下性质: 1、从根节点沿着边走到达任意一个结点走出的字符串都是原文本串的一个子串,而且两种不同的走法走出来的字符串一定不相同。 2、一个结点可以接受新后缀的意思是从根节点走到这个结点所得出的所有字符串,均为原文本串的后缀。 3、pre数组可以看做fail指针。并满足如果p可以接受新后缀,pre[原创 2016-01-19 21:28:30 · 1080 阅读 · 1 评论 -
[JZOJ5129][SDOI省队集训2017]字符串
题目大意从n个字符串中依次选出一个子串拼接,求本质不同的数量。SAM我们尽量长化前面的。 于是倒着做,对每个串都要建SAM。 只需要处理开头是某个字符的方案数,SAM的一个节点没有该转移边即可。 大概就这样,懒得写清楚了。#include<cstdio>#include<algorithm>#include<cstring>#define fo(i,a,b) for(i=a;i<=b;i原创 2017-06-02 21:11:04 · 682 阅读 · 0 评论 -
旅游路线
题目描述A君准备在Z国进行一次旅行,Z国中有n个城市,城市从1到n进行编号,其中1号城市为Z国首都。Z国的旅行交通网由n-1条单向道路构成,并且从任何一个城市出发都可以通过旅行网到达首都。 一条旅行交通网中的旅行线路,可以用线路上所经过的城市来描述,如{v1,v2,v3,……,vm},它表示一条经过了m个城市的旅行路线,且城市vi到城市vi+1有一条单向道路相连。 两个城市是相似的,当且仅当他们原创 2017-04-18 10:37:16 · 708 阅读 · 0 评论 -
[bzoj4698][SDOI2008]Sandy的卡片
题目描述Sandy和Sue的热衷于收集干脆面中的卡片。然而,Sue收集卡片是因为卡片上漂亮的人物形象,而Sandy则是为了积 攒卡片兑换超炫的人物模型。每一张卡片都由一些数字进行标记,第i张卡片的序列长度为Mi,要想兑换人物模型 ,首先必须要集够N张卡片,对于这N张卡片,如果他们都有一个相同的子串长度为k,则可以兑换一个等级为k的人 物模型。相同的定义为:两个子串长度相同且一个串的全部元素加上原创 2017-02-21 16:34:59 · 680 阅读 · 0 评论 -
[bzoj2946]公共串
题目大意求n个字符串的最长公共子串SAM对第一个字符串建SAM 每个节点为护f[i]表示所有串与该状态匹配的最长长度。 对于每一个字符串,都在SAM上跑,并每次都计算g[i]表示字符串与状态i匹配的最大长度。 做完后用g和f取min更新f。 每次跑完后,要逆推计算g。对于i,若g[i]>0,则g[pre[i]]=step[pre[i]]。因为i成功被匹配了,匹配长度>step[pre[i]]原创 2016-09-19 21:32:47 · 511 阅读 · 0 评论 -
子串
题目大意SA+莫队我们把所有字符串连起来,中间有分割符分开,然后求SA。 那么,一个子串所在第几个单词可以看以其为前缀的后缀包含了几个分隔符。 对于每个询问,我们二分找出在SA上的对应区间。于是,询问可以改成这样:求[l,r]权值在[x,y]的权值种类数。 可以用莫队做,用分块维护就可以消掉log,这是经典套路。#include<cstdio> #include<algorithm>#in原创 2016-09-18 21:46:49 · 611 阅读 · 0 评论 -
[51nod 1292]字符串中的最大值V2
题目大意求字符串中子串长度*出现次数的最大值模板题没什么好说的上个SAM 然后过程中发现我有一点老是忘: 忘记计算step 要注意的:计算parent树的子树信息,那么就按照step桶排,然后倒着扫。不能直接按照编号倒着扫。#include<cstdio>#include<algorithm>#include<cstring>#define fo(i,a,b) for(i=a;i<=b;原创 2016-08-18 11:31:14 · 682 阅读 · 0 评论 -
[HDU5659]knight
题目大意求一个字符串,从每一个位置分成两部分(当做两个字符串),求本质不同子串数量。SAM我们先有一个简单的思路。f[i]表示从i分成两部分的答案。 正难则反,求出原串本质不同子串数量,对于每个位置减去跨线且没在两边出现过的即可。 对于一个子串,如果其出现在原串中最大的右端点为mx,最小的右端点为mi,其长度为len。 如果mx-len>=mi,则因为其所有出现区间交为空,无论从哪个位置分开这原创 2016-08-15 22:37:40 · 700 阅读 · 0 评论 -
[bzoj4516][SDOI2016]生成魔咒
题目大意初始有一个空串。每次在末尾添加一个字符(字符集是[1,1000000000]的数字),并询问当前有多少本质不同的子串。一眼SAM虽然字符集很大,但是可以map耶有木有。 n log n就可以过啦,还可以在线的很兹瓷嘛! 为了练习SA由于我是蒟蒻,所以这题我最终打的是第二眼看出来的算法——后缀数组 首先它没有强制在线! 于是可以先把最终串搞出来。 然后把最终串倒过来。那么问题就被转化原创 2016-04-22 19:07:21 · 1138 阅读 · 0 评论 -
[bzoj3172][TJOI2013]单词
题目大意给定许多个单词,求每个单词在所有单词中出现的次数。SAM显然可以用SAM做。 一种是在单词与单词间加入字符{,第二种是trie上建sam,最简单当然是建广义后缀自动机。 建后缀树做法可以看用SAM建广义后缀树#include<cstdio>#include<algorithm>#include<cstring>#define fo(i,a,b) for(i=a;i<=b;i++)原创 2016-03-11 14:04:55 · 595 阅读 · 0 评论 -
用SAM建广义后缀树
原文写的还比较详细,所以本蒟蒻就不再自己写一个了…… 用SAM建广义后缀树例题TJOI的单词#include<cstdio>#include<algorithm>#include<cstring>#define fo(i,a,b) for(i=a;i<=b;i++)#define fd(i,a,b) for(i=a;i>=b;i--)using namespace std;const转载 2016-04-14 19:54:13 · 1822 阅读 · 0 评论 -
不是回文串
题目大意把APIO2014的回文串条件改为无限制。 该题还要限定出现次数大于1。 求答案。SAM裸题建出SAM。 不过要额外维护一个mxstep代表从根节点走到自动机上一个结点的最长路。 然后统计size。 注意的是据说这题不用桶排会超时。 接下来扫描每一个结点,如果其size大于1,就让mxstep[i]*size[i]与ans比较。#include<cstdio>#include<原创 2016-04-12 18:55:02 · 532 阅读 · 0 评论 -
[bzoj2555]SubString
题目大意要求兹瓷两个操作 1、在字符串后插入字符串变为新的字符串 2、询问字符串内某字符串的出现次数LCT维护SAM对于询问字符串出现次数而且要兹瓷在尾部添加字符,容易想到是SAM,根据pre指针建树,然后用LCT维护这颗pre树即可。#include<cstdio>#include<cstring>#include<algorithm>#define fo(i,a,b) for(i=a;原创 2016-03-09 18:18:43 · 1117 阅读 · 0 评论 -
怒打SAM
想要手玩SAM。 包括两层含义:手玩samjia,手玩后缀自动机 SAM-GEOTCBRL 决定跟随老司机的脚步原创 2016-03-08 13:56:04 · 545 阅读 · 2 评论 -
动物园
题目大意两个字符串a和b,从a中选取一个非空子串,从b中选取一个非空子串,然后拼起来变成回文串,求这个回文串最大长度。SAM先做一遍manacher处理出从某个串某个位置出发最长回文串。 先把b反过来。 然后你注意到这个回文串一定可以表示成c+S+c,其中S是一个回文串,然后c是a或b中选出的子串。 我的做法是把a和b一起丢去做广义SAM,然后计算每个节点是否同时出现在两个串中,并维护righ原创 2017-07-10 10:03:00 · 650 阅读 · 0 评论