
后缀自动机
文章平均质量分 66
DOFYPXY
这个作者很懒,什么都没留下…
展开
-
[BZOJ3998][TJOI2015]弦论 后缀自动机
建出SAM。 假设T=0,那么除了根节点每个点代表1个串。 假设T=1,那么除了根节点每个点代表其right集合大小个字串。 先把每个点代表多少个串统计出来,然后就可统计统计转移到某个点之后还能走出多少个字串。 代码:#include<iostream>#include<cstdio>#include<cstring>#define ll long longusing namespa原创 2017-12-26 07:47:18 · 413 阅读 · 0 评论 -
[BZOJ2882]工艺 后缀自动机
裸题啊。。。把串复制一遍建SAM,直接跑出最小的那个字串就可以了。 代码:#include<iostream>#include<cstdio>#include<map>using namespace std;const int maxn=1200010;int s[maxn],n;struct sam{ int cnt,last,mx[maxn],fa[maxn];原创 2017-12-26 07:48:50 · 291 阅读 · 0 评论 -
[BZOJ4566][HAOI2016]找相同字符 后缀自动机
题目要求的就是B的每个字串在A中的出现次数之和。 我们考虑先建出A串的SAM,每个点所代表的串的个数就是|Righti|∗(Maxi−Maxfai)|Right_i|*(Max_i-Max_{fa_i})。我们可以发现经过一个点的时候,它在parent树上所有祖先代表的串出现次数也都加一,所以我们设SumiSum_i为它和它祖先所代表串个数之和。 那么把B放在SAM上面跑,每经过一个点xx,对答原创 2017-12-26 18:44:43 · 522 阅读 · 0 评论 -
[BZOJ2865]字符串识别 后缀自动机+线段树
首先只出现过一次的子串,就是SAM上那些|Right|=1|Right|=1的点。 对于这些点考虑它们的最小拓展长度为Mini=Maxfai+1Min_i=Max_{fa_i}+1,又因为|Right|=1|Right|=1,所以这个点在字符串上的位置就是MaxiMax_i。 所以对于[Maxi−Mini+1,Maxi][Max_i-Min_i+1,Max_i]的位置xx有一个长度为MiniM原创 2018-01-04 21:50:40 · 573 阅读 · 0 评论 -
后缀自动机小记
感觉高一学的SAM太假了,重学一遍。。。后缀自动机(SAM)的由来我们需要一种可以识别串S的所有字串的自动机,我们显然可以把S的所有后缀建成Trie树,那么树上每一个点都代表S的一个子串。但这样状态数是n2" role="presentation" style="position: relative;">n2n2n^2级别的,考虑到Trie树上有很多重复部分,所以有了SAM这个东西。原创 2017-12-26 19:20:02 · 500 阅读 · 0 评论 -
[联合集训6-12] String 后缀树
先考虑假设我们把所有后缀建成一个Trie树,那么一个后缀字典序能成为最大就会带来一些限制,具体地就是从根出发遍历这个串,遍历的边上的字母映射的值要大于其他边上的字母。我们只要对于每个后缀带来的限制判一下环即可,复杂度O(n2c)O(n2c)O(n^2c),其中ccc为字符集大小。 可以利用后缀树的性质优化上面的操作,也就是把只有一条出边的点压缩起来,其中第一条边的字母充当压缩后的边上的字母即可。...原创 2018-06-20 18:53:31 · 301 阅读 · 0 评论