
后缀自动机
文章平均质量分 56
wwyx2001
OIer----这条路,仅一人独行
展开
-
[BZOJ4032][HEOI2015]最短不公共子串(dp+后缀自动机)
题目:我是超链接题解:后缀自动机只是一个幌子?其实只有第三问才用啦,神题4合1?总之这个题目记住的原则就是 1、最短不公共长度实际上就是最长匹配中的最小值+1 2、如果某一方是子串,要想方设法让子串依次转移不能跳First:A子串≠B子串想想我们以前求最长公共子串的时候吧 f[i][j]表示A的第i位匹配到B的第j位的最长公共长度 f[i][j]=f[i-1][j-...原创 2018-02-27 21:21:41 · 647 阅读 · 1 评论 -
[BZOJ2806][Ctsc2012]Cheat(后缀自动机+单调队列优化dp)
题目:我是超链接题解:我们先把标准串建出一个广义后缀自动机 二分一个L,用dp判断可行性,dp?!首先我们要用后缀自动机预处理出l[i],表示第i位一定选,可以匹配上的最长长度,即向前延伸最远可以和标准串匹配的长度怎么用dp判可行啊?f[i]表示前i位能称为【熟悉】的最大长度,那么最后用f[n]和len比一比看看到不到90%就好,f[i]怎么求呢? 不难写出转移方程f[i...原创 2018-02-27 16:15:56 · 429 阅读 · 0 评论 -
[BZOJ3277]串(广义后缀自动机)
题目:我是超链接题解:这题的建立后缀自动机的方法和上道题目一样我们先简化一下问题,不考虑k,只考虑怎么找到子串个数。我们根据以前的经验,step[i]-step[fa[i]]的值就是以某个状态为后缀的不同子串的个数,这道题目虽然没有说明白,但子串相同的情况是允许的。right集吗?好像也可以,但是如果加入【在所有字符串中出现k次】这个约束就不行了,因为出现k次我们是以儿子为...原创 2018-02-26 21:31:03 · 426 阅读 · 0 评论 -
[BZOJ2780][Spoj8093]Sevenk Love Oimaster(广义后缀自动机)
题目:我是超链接题意:给出n个原串,再给出m个查询串。求每个查询串出现在了多少原串中。题解:建立后缀自动机,所谓广义就是将几个串建立在同一个自动机上,每次加入一个新串的时候,将last恢复到root,然后其他照常做就可以了。如何统计每个状态出现在了多少原串中呢?我们对于每个状态维护两个值size,nxt。nxt存储的是上一个到达这个状态的串是哪个原串,如果与当前的原串相同就...原创 2018-02-26 17:16:57 · 405 阅读 · 0 评论 -
[BZOJ3926][ZJOI2015]诸神眷顾的幻想乡(广义后缀自动机)
题目:我是超链接题解:广义的后缀自动机就是对多串建立的后缀自动机。 对于这道题目来说,要求不同的子串个数,这个不就是裸的step[i]-step[fa[i]]吗,但是由于还有”顺序“问题(红黄蓝和蓝黄红),那么我们就需要对于不同的顺序建立后缀自动机,我们发现题目说叶节点不超过20个,那么我们可以从叶节点开始每次遍历树建立后缀自动机,这样得到了所有的链(即获得了所有可能的顺序),然后在...原创 2018-02-25 21:29:08 · 332 阅读 · 0 评论 -
[BZOJ4566][HAOI2016]找相同字符(后缀自动机)
题目:我是超链接题解:又有点像当时找公共子串的时候了,这个位置不同的也可以一定要扯上right集了 对第一个串建立后缀自动机,然后用第二个串在自动机上进行匹配 sum表示的是当前状态之前fa链上点的总贡献。因为如果匹配到当前的状态,那么fa链上之前的就都被匹配上了。sum[i]=sum[fa[i]]+(l[fa[i]]−l[fa[fa[i]]])∗right[fa[i]]sum...原创 2018-02-25 19:01:21 · 397 阅读 · 0 评论 -
[BZOJ4516][SDOI2016]生成魔咒(后缀自动机)
题目:我是超链接题解:对于一个状态s,他的right集合代表的子串的长度就是(len[fa],len[s]]。这道题我们需要动态的维护不同子串的个数,每次从头扫一遍直接计算肯定不行,我们考虑加入一个新字符会产生多少新的不同子串,这个个数其实就是(len[fa],len[s]]的区间长度。代码:#include <map>#include <cstdio&...原创 2018-02-24 21:29:08 · 356 阅读 · 0 评论 -
[BZOJ3238][Ahoi2013]差异(后缀自动机)
题目:我是超链接题解:后缀自动机的Parent指针反向以后可以形成一个树结构,和AC自动机的Fail树是类似的。这棵树有一个性质:两个子串的最长公共后缀所代表的状态,是这两个子串代表的状态在Parent树上的LCA位置。原因也很简单,首先顺着Parent指针往上跳达到的就一定是一个串的后缀,并且跳的步数越少后缀越长。那么用最少的步数让两个状态到达一个节点,这个节点肯定就是最长的公共...原创 2018-02-24 20:28:53 · 470 阅读 · 0 评论 -
[CF235C]Cyclical Quest(后缀自动机)
题目:我是超链接题意:给出一个字符串T,再给出N个字符串S,每次回答字符串S的所有循环串在T中出现次数,重复的不计入答案. 这里的循环串的意思 每次将首位字符置于末位置后形成的新串题解:要求出现次数很显然是需要我们建立Right集合了,这个循环串的解决方法就是把S复制两遍 有点像求公共子串的样子在自动机上奔跑,如果匹配到了就统计答案,然后如果此时匹配到的点在Parent树中的...原创 2018-02-24 16:10:12 · 446 阅读 · 0 评论 -
[SPOJ8222]NSUBSTR(后缀自动机)
题目:我是超链接题意:f(i)表示的是长度为i的子串的最大出现次数,求f(1..n)题解:这类问题大多数是利用Right集合的性质,因为一个节点代表的字符串一定在Right集合包含的所有位置上重复出现。想要得到关于每个节点Right集合的信息,只需要在建立自动机以后按照拓扑序从后往前,用每个节点来更新它的fa节点就可以了。对于这道题目来说,它要求每个长度的串出现次数的最...原创 2018-02-24 10:29:29 · 441 阅读 · 0 评论 -
[BZOJ3998][TJOI2015]弦论(后缀自动机)
题目:我是超链接题解:因为后缀自动机可以识别串S的所有子串,所以它是解决这类问题十分方便的一个方法。我们可以顺着自动机这个有向无环图来DFS,对于每个节点预处理它往后还能经过多少不同的子串,再决定走哪条路就可以了:如果他的儿子的size>=k就说明第k小的子串的结尾在该子树中,否则k-size,然后从下个继续。有点主席树查询区间k大的意思。 这个预处理就相当于求DAG中一个节...原创 2018-02-23 15:40:41 · 312 阅读 · 0 评论 -
[BZOJ2946][POI2000]公共串(后缀自动机)
题目:我是超链接题解:后缀自动机的应用—-公共子串问题 对第一个串建立后缀自动机,不过这次匹配的时候是多个串进行匹配。每次匹配的时候对于后缀自动机中的每个节点维护一个值h,表示的是到达该节点所能匹配上的最大长度。光匹配还不够,我们需要按照拓扑序倒序,用每个节点取更新他的parent节点,因为如果匹配到一个状态,那么实际上他parent链上的所有状态都匹配上了。然后对于每个串匹配后...原创 2018-02-22 21:30:57 · 299 阅读 · 0 评论 -
后缀自动机学习笔记
因为喵喵喵实在是太zz了发现BJ初三的dalao就会SAM,赶快跑回来自己学习。好麻烦啊翻了一堆讲义总算弄明白一些了,写个学习笔记加深印象吧。什么是后缀自动机?后缀自动机顾名思义就是一棵包含了原串s所有后缀的字母树。如果直接像构建trie树的方式构建节点数应该是|S|^2,这个空间显然承受不住。一坨定义ch[x][s]表示的是节点x(也可以说是状态)字符s的节点编号...原创 2018-02-21 20:04:58 · 481 阅读 · 0 评论