字符串—后缀数组
文章平均质量分 67
My_ACM_Dream
生活没有彩排每天都是现场直播
展开
-
hdu 1403 Longest Common Substring (后缀数组模板题)
题意:求两个串的最长公共子串。题解:后缀数组搞定。#include#include#include#include#include#include#include#include#includeusing namespace std;#define B(x) (1<<(x))typedef long long ll;const int oo=0x3f3f3f原创 2015-03-04 13:57:22 · 544 阅读 · 0 评论 -
hdu 4416 Good Article Good sentence (后缀数组)
题意:给出一个串a,和n个串b,现在问a串的子串中在b中未出现的个数。题解:全部链接计算不同子串个数sum1,链接b串计算不同子串个数sum2,然后用sum1-sum2就是答案。因为先计算全部的在计算b的,所以我们将a串存在最后面,这样在计算第二次的时候就可以很快处理。#include#include#include#include#include#include#原创 2015-03-13 23:31:05 · 489 阅读 · 0 评论 -
hdu 4691 Front compression (后缀数组+rmq)
明知道水题,就是读不懂题目。#include#include#include#include#include#include#include#include#includeusing namespace std;#define B(x) (1<<(x))typedef long long ll;const int oo=0x3f3f3f3f;const ll OO=1原创 2015-03-09 17:10:06 · 578 阅读 · 0 评论 -
poj 2758 Checking the Text (后缀数组应用)
题意:给出一个串,对这个串进行插入,查询,查询是按照原来串的位置进行查询a,b为开头的后缀的最长公共前缀。题解:的确是一道好题。参考大牛博客#include#include#include#include#include#include#include#include#includeusing namespace std;#define B(x) (1<原创 2015-03-09 00:19:58 · 880 阅读 · 0 评论 -
poj 3415 Common Substrings (后缀数组应用)
题意:给出两个串,求着两个串的公共子序列至少是k长度的个位数(允许重复)题解:先是看了国家队论文得到了点启示,然后具体是想出处理的办法,但是操作起来各种不顺,之后参照了别人的代码,了解到了一种和我做法一样的处理方法。启示这题相当于贪心,对于任意两个后缀(分别是A串和B串的),对于这两个后缀,如果最长前缀是L,那么要得到至少是k的长度那么L>=k,于是很容易可以看出这个两个后缀为整个原创 2015-03-06 20:17:49 · 594 阅读 · 0 评论 -
spoj 220 Relevant Phrases of Annihilation (后缀数组应用)
题意:给出n个串,求着n个串最长公共子串,并且子串在各个串中至少重复两次,并且不能重叠的重复。题解:这里又用到了后缀的分组,我们首先拼接n个串然后跑一边后缀数组,二分长度,接着根据height分组,然后统计每组的后缀所属的串的个数,并且要判断是否存在至少重复两次的子串且不重叠,统计所属串的个数可以用set存,然后获取size即可,对于后一个问题,我们将每次分得的组统计所属每个串的SA[原创 2015-03-07 14:31:02 · 574 阅读 · 0 评论 -
poj 3581 Sequence (后缀数组好题)
题意:给出一个字符串,求这个字符串分成三段并且反转着三段得到字典序最小的序列。题目保证第一个字符最大。题解:题目保证第一个字符最大是非常有用的条件,我们可以用贪心,将字符串倒叙,找到字典序最小的后缀作为第一段,注意最小要字典序是在不会导致有一段是空串的前提下,例如 4 3 2 1 明显倒序后最小后缀时1 2 3,但是这样不可取,因为如果去1 2 3,那么其他两段就是空串了!这是求出了第原创 2015-03-08 13:13:13 · 622 阅读 · 0 评论 -
yy浅谈后缀数组
后缀数组是一种很优美的数组结构,基本上可以完全替代后缀数,后缀数组无论是在内存的占用或者是时间复杂度都和后缀树差不多,但是操作性比后缀树好很多。后缀数组可以说是字符串处理的神奇啊!想的到的,想不到的都可以处理。后缀数组的应用也是十分的广泛。后缀数组普遍可以通过O(nlogn)的复杂度解决很多问题。一下是一些例题和后缀数组的一些应用。1、求两个串后缀的最长公共前缀,height数组原创 2015-03-07 14:38:20 · 1092 阅读 · 0 评论 -
poj 3294 Life Forms (后缀数组应用)
题意:给出n个串,求这个n个串中至少是n/2个串的最长公共子串,注意要>n/2.题解:后缀数组的应用之一,做法:1、将n个字符串拼接在一起,每个字符串拼接的符号最好是小于所有串的,这样排序以后会跑到开头,比较好处理,其实可以将字符串装化为int,同时加上10,这样会省去很多麻烦。2、跑一边后缀数组,,二分答案,判定答案:根据height进行分组(这种方法经常有),每组的公共前缀原创 2015-03-07 10:43:03 · 650 阅读 · 0 评论 -
对于最长连续重复子串伤感经历
最长连续重复子串问题,一般是问重复的最大数,更强的就是要求输出字典序最小的一个答案。对于这种问题,我们没有什么好办,只能枚举重复子串的长度L,在纸上写些数据会发现,重复子串会覆盖s[0],s[L],s[2*L],...,S[i*L]其中相邻的两个。这样求s[i*L]和s[(i+1)*L]的最长公共前缀为k,通过测试数据会发现这样的规律,重复次数r=k/L+1;这样做只能说肯定能找到对应的连续重原创 2015-03-06 00:56:28 · 877 阅读 · 0 评论 -
hdu 2328 Corporate Identity (后缀数组应用)
题意:给出n个字符串,求字典序最小的最长公共子串。题解:二分长度,然后用后缀数组判断是否满足,根据height分组,找出分组中包含n个字符串的后缀的分组。字典序最小也容易处理,直接看代码就好了。先前忘记了n有4000多了,结果桶排序的上限搞错了,一直wa。#include#include#include#include#include#include#include#原创 2015-03-08 15:46:11 · 541 阅读 · 0 评论 -
poj 1226 Substrings (后缀数组应用)
题意:给出n个串,求一个最长的串,使得这个串或是这个串反转后的串出现在n个串中。题解:将每个串反转接到原串后面,用分隔符分开,然后就可以像求最长公共子串那样做了。#include#include#include#include#include#include#include#include#includeusing namespace std;#define B原创 2015-03-07 21:26:12 · 479 阅读 · 0 评论 -
poj 3261 Milk Patterns (后缀数组+二分答案)
题意 :给出n个数,求n个数组成的串的子串中满足重复k次并且长度最长。题解:二分枚举长度,然后判断是存在这样的串,判断方法将后缀分组,然后只要判断是否存在这样的组:里面有至少k个后缀。注意,n个数可以为0,所以全部加1。#include#include#include#include#include#include#include#include#includeu原创 2015-03-04 20:56:43 · 562 阅读 · 0 评论 -
spoj 694 Distinct Substrings (后缀数组应用)
题意:给出长度为n的串,求这个串中不通的子串个数。题解:首先我们分析,这种题应该从每个子串入手,每个子串肯定是后缀的前缀,所以分析后缀的一些关系。单独分析一个后缀能为不通子串个数贡献多少,如果按照SA的顺序不断计算出后缀,当要加入k这个后缀时,他的长度为n-SA[k],那么他可以贡献出的前缀也就是子串的个数肯定有n-SA[k],但是他和前一个后缀有重叠部分重叠部分的长度便是多计算的子串原创 2015-03-04 21:21:23 · 502 阅读 · 0 评论 -
poj 2406 Power Strings (用kmp代替后缀数组求解)
题意:给出一个串,这个串是由R个子串重复得到,求最大的这个R。题解:算法集合之《后缀数组》国家对论文是说用后缀数组可以处理复杂度是O(n),但是感觉大材小用了,这题用kmp完全可以解决。#include#include#include#include#include#include#include#include#includeusing namespace st原创 2015-03-04 22:00:36 · 581 阅读 · 0 评论 -
poj 1743 Musical Theme (后缀数组+二分答案)
题意:给出n个数字的串,将这个串后一个减去前一个,所得的串尽心操作。问所得的串最长不重复子串的长度。题解:这种题目很明显没办法直接求得长度,那么可以考虑二分答案判断是否满足条件。我们可以二分得到k,判断是否存在这样的k。对于如何判断,我们可以将后缀根据height的值进行分组,每组的后缀之间的最长公共前缀必须至少为k,这样之后只要找出每组中最大SA值和最小SA的值的差即可。好好理解下,原创 2015-03-04 17:55:38 · 645 阅读 · 0 评论 -
hihoCoder 1084 扩展KMP(后缀数组)
题意:给出两个串,A和B,问A串中有多少个子串和B是‘匹配’的。这里的匹配要满足:将一个字符串转化为另一个字符串所需要改变字符的最小数目。对于A中的一个子串,如果它的长度和B的相同且它们之间的海明码距离不超过k,我们认为它们是匹配的.题解:用后最数组匹配A的正串的每个后缀和B的正串的最大匹配数,相反同样用后缀数组匹配A的反串的后缀和B的反串的最大匹配。分别用f[i][0]和f[i]原创 2015-04-27 00:13:20 · 1087 阅读 · 1 评论