后缀自动机
EMber _
人但有追求,世界亦会让路。
展开
-
bzoj3238 [Ahoi2013]差异 后缀自动机
题意:给出一个串,求其中任意两个字串的lcp的总和。我们可以对于这个串建一颗后缀自动机,实际上,他的parent边树就是一颗后缀树,我们在后缀树上统计答案,设f表示right集合的大小,可以理解为后缀树的siz,然后w是f的前缀和。mx按照基数排序,然后扫一遍就可以统计答案了。 #include<cstdio>#include<cstring>#include<algorithm>#inclu原创 2017-04-12 21:51:47 · 459 阅读 · 0 评论 -
bzoj2946 [Poi2000]公共串 后缀自动机
原来2000年就有SAM了,害怕 先对第一个串建一个SAM,然后把其他串在上面匹配,得出每个状态的最大匹配长度,然后对每个状态取所有串的最小值,这就是最长公共子串,然后对所有子串求个mx就好了。#include<cstdio>#include<algorithm>#include<cstring>#include<iostream>#define fo(i,a,b) for(int i=a原创 2017-07-23 10:51:34 · 332 阅读 · 0 评论 -
bzoj3926[Zjoi2015]诸神眷顾的幻想乡 广义后缀自动机
广义后缀自动机裸题,具体可以参考15年国家队论文。 其实就是在trie上建SAM,一边dfs一边建就可以了。#include<cstdio>#include<algorithm>#include<cstring>#include<iostream>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>原创 2017-07-23 17:26:58 · 229 阅读 · 0 评论 -
bzoj3998 [TJOI2015]弦论 后缀自动机
经典的求k小子串的问题。 根据right集合的定义,如果是相同子串不同位置算作一个,那每一个right集合对应的左右区间长度的大小就是这个right集合所包含的不同子串个数。 但是知道了这个并不代表我们可以直接求出来= =因为你并不知道k小是right集合中的哪一个,也就是说你没有办法准确的用尽量小的复杂度去把这个K小的子串拿出来,所以我们只能在dag上搞事情。。设sum[i]表示以i为根时子树原创 2017-07-24 10:36:11 · 209 阅读 · 0 评论 -
codeforces 802I 后缀自动机
题意:给你一个字符串,统计他的所有不同子串的出现次数的平方和,n<=100000n<=100000 其实相当于一个SAM的模板题吧。 首先你要理解SAM的存储方式以后就可以轻松切这题。。 SAM建立了一个parent树还有一个DAG,这里显然和DAG没什么关系。 对于parent树上的每个节点,他有一个right集,存储这一些子串的右端点下标,同时还有一个对应区间min(len),max(原创 2017-08-20 15:36:22 · 447 阅读 · 0 评论