字符串:后缀自动机
文章平均质量分 92
ProLightsfxjh
这个作者很懒,什么都没留下…
展开
-
SPOJ - LCS2 Longest Common Substring II 后缀自动机
题意:给出n(n<=10)个字符串,求它们的最长公共子串。后缀自动机先用第一个字符串建立后缀自动机,然后用剩余的n-1个字符串在自动机上跑,每次把以节点i结尾的最长公共子串保存在minl[i]中,0<=i<= sam.tot。数组遍历一遍minl数组,找最大的minl[i]就是这n个串的最长公共子串了。复杂度 O(10length)原创 2017-03-04 19:01:38 · 1028 阅读 · 0 评论 -
SPOJ - LCS Longest Common Substring 后缀自动机
题意:求两个字符串的最长公共子串。后缀自动机看了很久 WJMZBMR 讲后缀自动机的ppt才大致把后缀自动机搞懂^_^,此外附上两个比较好的讲后缀自动机的博客 后缀自动机 模版,后缀自动机讲解这题直接用一个字符串建立后缀自动机,然后用另一个串在自动机上跑即可,操作和AC自动机有点类似,只是AC自动机匹配失败的时候用的fail指针,而这里用pre树跳转。复杂度 O(n)原创 2017-03-04 18:54:55 · 846 阅读 · 0 评论 -
HDU - 4622 Reincarnation 后缀自动机
题意:给出一个长度<=2000的字符串,然后给出q<=10000个询问,为s[l,r]内有多少个不同的子串。后缀自动机首先n <= 2000,故可以用O(n^2)的算法,故对于每个 i ~ n-1建立n个后缀自动机,每次添加一个字符就多出val[np] - val[pre[np]]个不同的子串,valx]表示x节点存储的字符串个数即能表示的最长子串。故用sum[maxn][maxn] n个前缀和来存储区间内不同子串的个数。复杂度 O(n^2)原创 2017-03-05 19:04:21 · 1077 阅读 · 0 评论 -
HDU - 5769 Substring 后缀自动机+二分、新增distinct子串的个数和位置
题意:每次给出一个字母ch和一个字符串s,求s中有多少个不同的子串含有字母ch。后缀自动机+二分、新增distinct子串的个数和位置首先这里要用到后缀自动机的一个性质,添加第i个字符时,自动机里新增了diff = val[np] - val[pre[np]] 个与原先不同的子串,它们分别是 s[0......i],s[1......i],……,s[diff-1......i],这里可以证明,当k < j < i 时,如果 s[j......i]是新增的不同子串,则s[k......i]包括了s[j原创 2017-03-12 22:48:34 · 701 阅读 · 0 评论 -
HihoCoder - 1445 后缀自动机二·重复旋律5 后缀自动机
题意:统计字符串中不同子串的个数。后缀自动机这题是后缀自动机基础题,直接使用SAM上的pre树, sigma{val[np] - val[pre[np]]}复杂度 O(n)原创 2017-04-22 18:30:30 · 1040 阅读 · 0 评论 -
HihoCoder - 1449 后缀自动机三·重复旋律6 后缀自动机、递推、DFS
题意:求一个字符串中,所有长度为K的子串出现次数最多的子串的出现次数,但是K不是固定的,求所有的K的答案。后缀自动机、递推、DFS首先 ans[MAXN] 必定是单调不增序列,一个子串出现的次数是它的endpos集合的大小,由于endpos[u]的集合为以u代表的子树的endpos集合的并集,可以跑一边dfs,预处理出所有的endpossz[i]。所以只需要根据pre树求出,ans[maxlen(st)] = max(ans[maxlen[st], endpossz[st]),然后从len~0递推,原创 2017-04-22 18:43:32 · 1108 阅读 · 0 评论 -
HihoCoder - 1457 后缀自动机四·重复旋律7 后缀自动机+拓扑排序+递推、BFS
题意:所有字符串的不同子串的“和”(也就是把串看成数字,在十进制下的求和,允许有前导0)。后缀自动机+拓扑排序+递推、BFS首先如果只是一个字符串,则转移的时候,st[i] == v节点会转移到u节点,则 cnt[u] = sigma{cnt[v] * 10 + c * |substrings(v)| | trans[v][c] = u},其中cnt[v]表示以v结尾的不同子串的和, |substrings(v)| 即为以v结尾的不同子串的个数即从s到v的路径数。然后推广到这里的n个串,可以用原创 2017-04-22 19:02:27 · 1337 阅读 · 0 评论 -
HDU 6208 The Dominator of Strings 后缀自动机
题意:每组数据给出n个字符串,每组总共最多1e5个字符,然后要求判断,其中是否存在一个字符串,而其它字符串是这个字符串的子串。总共有30MB的输入。贪心+后缀自动机如果用AC自动机来做很可能会TLE,但后缀自动机在这里相对不容易被卡掉,首先我们多出了一个贪心优化,那就是那个可能存在的母串必定是长度最长的字符串,如果长度最长的字符串不止一个,则它们必定是完全相同的,所以后缀自动机只会用最长的那个字符串来建立自动机,而如果是AC自动机则必须使用全部的字符串来建立自动机,加上乘个memset[26]很容易被卡原创 2017-09-18 12:31:40 · 1271 阅读 · 0 评论 -
XIII Open Championship of Y.Kupala Grodno SU Grodno Problem E. Enter the Word Problem 贪心+后缀自动机
题意:这里对于生成一个字符串有2种操作,1、在末尾添加一个字母,花费代价为 1;2、在末尾添加一个substr,且该substr为已存在字符串的子串,花费代价为 1。现给出需要构造出的字符串,为最小的构造代价。贪心+后缀自动机贪心策略是 对于剩下的字符串suf,取它的最大前缀 substr,且substr是已构造出的字符串pre的子串,如果substr为空则执行操作1,否则执行操作2,这样每次都添加尽可能多的字母,所以代价是最少的。所以对于前缀pre建立后缀自动机,每次把suf丢进去匹配,其最大的原创 2017-10-06 14:10:40 · 1162 阅读 · 0 评论