后缀自动机
twh233
嘻嘻
展开
-
spoj 8222 Substrings 可重复的一个串出现了多少次
f[i]指长度为i的串出现次数的最大值。这里的不同出现指,可以有重复串,只要起始位置不同就视为不同的出现。求f[1]..f[lenth]。LCS那篇里提到了,通过fa指针回退,会回到一个状态,这个状态的接受串与当前状态的接受串后缀是相同的。那么,设t[i].fa=j,那么i状态的接受串也必定出现在j状态的接受串的后缀中。又注意到ij的接受串的结束位置是不原创 2017-09-13 14:32:53 · 238 阅读 · 0 评论 -
子串总长度 sam
子串总数*子串总长。总数还是父亲节点-儿子节点的长度,另外子串长度就是len[fa[i]]+1,len[fa[i]]+2,...+len[i]//china no.1#pragma comment(linker, "/STACK:1024000000,1024000000")#include #include #include #include #include原创 2017-10-18 21:40:12 · 403 阅读 · 0 评论 -
子串总个数 顺带sam 模版
//china no.1#pragma comment(linker, "/STACK:1024000000,1024000000")#include #include #include #include #include #include #include #include #include #include #include #include #include #原创 2017-10-18 21:38:01 · 461 阅读 · 0 评论 -
poj1509 Glass Beads 找最小的字母边转移
传送门Sample Input4helloworldamandamandadontcallmebfuaaabaaaSample Output101165poj1509 Glass Beads每次找最小的字母边转移,转移l次,找到的就是最小串表示的结尾点。为什么每次找最小的子字母边转移,不会使得在没找到l次后就到达结束状态(没法再转移下去了)原创 2017-09-12 23:28:32 · 217 阅读 · 0 评论 -
spoj1812 Longest Common Substring II(LCS2)多个字符串
1811LCS的升级版。求十个串的最长连续公共子串。第一个串建立自动机。用其它每个串在自动机上跑一遍,记录每个状态上能匹配的最长长度。然后求每个状态匹配长度的最小值。注意每个状态能匹配的,每个状态的父节点也能匹配。利用拓扑排序(按照len),从深到浅依次更新父亲的匹配长度。由于spoj实在是太搓,这一步要用基数排序,或者是O(n)原创 2017-09-12 23:01:29 · 226 阅读 · 0 评论 -
spoj1811 Longest Common Substring(LCS)最长公共子串
spoj1811LCS问两个字符串最长公共子串。做法很简单。匹配成功,则tl++,失败,从父指针回退,tl=t[now].len。从这题可以清楚了解后缀自动机fa指针的性质:指向一个状态,这个状态的接受串s[x..x+i]是与当前状态的接受串后缀s[j-i..j]匹配是最长的一个。这里是不是发现了一个和KMP很像的性质?KMP在失配时通过next原创 2017-09-12 21:29:43 · 270 阅读 · 0 评论 -
hdu 6194 恰好出现k次的子串
传送门题意:给你一个字符串,和一个k,问你字符串中恰好出现k次的子串有多少种。思路:HDU4641的简化版,HDU4641求的是>=k次的子串个数,所以现在我们只需跑两次计算出>=k次的和>=k+1次的,两者相减即位恰好出现k次的子串个数。//china no.1#pragma comment(linker, "/STACK:1024000000,原创 2017-09-12 00:01:37 · 1629 阅读 · 2 评论 -
后缀自动机应用
在解决问题中的应用下面看在后缀自动机的帮助下我们能做什么。 简便起见,我们假设字母表的大小k为常数。存在性查询问题.给定文本T,询问格式如下:给定字符串P,问P是否是T的子串。 复杂度要求.预处理O(length(T)),每次询问O(P)。 算法.我们对文本T用O(length(T))建立后缀自动机原创 2017-09-11 17:18:45 · 405 阅读 · 0 评论 -
hdu 6208 The Dominator of Strings 后缀自动机 LCS
The Dominator of StringsTime Limit: 3000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 668 Accepted Submission(s): 197Problem DescriptionH原创 2017-09-18 23:42:14 · 315 阅读 · 0 评论 -
bzoj 2806 多个串匹配
题意:多个主串和多个询问串,每次询问将询问串分成多个连续子串,如果一个子串长度>=L且在主串中出现过就是熟悉的如果熟悉的字符串长度>=询问串长的90%就是熟悉的文章;求成为熟悉的文章的最大的L 主串建广义SAM然后二分L判断可行性使用DP判断L是否可行,一定要注意是长度不是数量,煞笔Candy?就看错题了len[i]表示i位置之前最大公共长度,和原创 2017-09-14 22:33:23 · 243 阅读 · 1 评论 -
bzoj 3238 lcp
DescriptionInput一行,一个字符串SOutput 一行,一个整数,表示所求值Sample InputcacaoSample Output54这道题需要知道后缀自动机的一个性质,两个串的最长公共后缀,位于这两个串对应状态在parent树的最近公共祖先上。分析一下题目中的式子,原创 2017-09-14 16:48:13 · 155 阅读 · 0 评论 -
poj 1743 不可重叠最长重复子串
先考虑求一个出现次数>=2的最长子串出现次数>=2那就只管|right(x)|>=2的点然后对这些点的代表的子串长度取max即可加上了不相交的限制,类似后缀数组的做法我们就记录right集合的最大/最小值,他们的差值就是能不相交的最长长度拿它和该点的maxs取min即可,然后对所有点的答案取max即可SampleInput原创 2017-09-14 15:39:48 · 437 阅读 · 0 评论 -
bzoj 3998 第K小子串
【题意】 询问排名第k的子串是谁,0代表相同子串不同位置算作相同,1代表相同子串不同位置算作不同。 【思路】 0的情况和这个题一样每个子串不同位置出现次数算作1; 至于1,统计val作为该子串在不同位置出现的次数,就是求一下|right|的大小呗,相应修改一下就可以了。Sample Inputaabc0 3Sample Outpu原创 2017-09-14 12:46:34 · 1538 阅读 · 0 评论 -
hdu4641 K-string 出现K次以上 带更新
传送门首先,我们要知道后缀自动机能够建立一个父指针树。(以fa指针为边的树)然后呢,这个神奇的树有这样的性质:1.对于每个节点,父节点的接受串是该节点的接受串的后缀,而且是最长的那个。所以呢,用该节点的len减去父节点的fa.len,就是该节点表示的串中父节点不能表示的串个数。当某节点的计数到达k次时,就说明有len-fa.len个不同子串计数到达k次了。(同理,当插入原创 2017-09-13 15:44:27 · 207 阅读 · 0 评论 -
串f在串s中第一次出现的位置 sam
如果能跑到底 说明f是s的子串,所以中途有任何不能跑的地方一定是-1,puts("NO");//china no.1#pragma comment(linker, "/STACK:1024000000,1024000000")#include #include #include #include #include #include #include #i原创 2017-10-18 21:59:19 · 7988 阅读 · 0 评论