后缀数组
画船听雨
和梦想谈一次恋爱,也要疯狂,也要坚持
展开
-
POJ 2774 Long Long Message && URAL 1517. Freedom of Choice(求最长重复子序列)
两个题目意思差不多,都是让求最长公共子串,只不过poj那个让输出长度,而URAL那个让输出一个任意的最长的子串。解体思路:Long Long MessageTime Limit: 4000MS Memory Limit: 131072KTotal Submissions: 22313 Accep原创 2015-01-26 21:31:44 · 1375 阅读 · 0 评论 -
SPOJ 694. Distinct Substrings,705. New Distinct Substrings(后缀数组)
题目大意:给定长度为N的字符串,求出其中不相同子串的个数。解题思路:每一个字串一定是某个后缀的前缀,那么原问题就可以等价于求所有后缀之间的不相同的前缀的个数。如果所有的后缀按照suffix(sa[1]),suffix(sa[2])……suffix(sa[n])的顺序计算,我们会发现对于每个新加进来的后缀suffix(sa[k]),它将产生n-sa[k]+1个新的前缀。但是其中有leight[k原创 2015-01-22 19:29:52 · 1049 阅读 · 0 评论 -
URAL 1297. Palindrome(后缀数组求最大回文串)
题目大意:给你一串字符串,让你求出来它存在的最长连续的回文串。解题思路:先把字符串逆序加到数组中,然后用后缀数组求解。两种方法:1,枚举排名,直接比较rank相同的字符串的位置差是不是len。如果是的话,就记录求解;2,枚举地址,求第i地址与第2*len-i+1的lcp的最大值。PS:需要注意如果多解输出靠前的字符串。两种写法写在了一起,分别是Del,和Del1函数。1原创 2015-01-23 21:24:09 · 1120 阅读 · 0 评论 -
POJ 1743 Musical Theme(后缀数组)
题目大意:给出n个数字。首先将这n个数前后做差,得到另一个长度是n-1的序列。求出这个序列的最长重复子串,且这些子串不能重叠。PS:这题论文上有解析。解题思路:先二分答案,把题目变成判断性问题:判断是否存在两个长度为k的字串是否相同的,且不重叠。解决这个问题的关键还是利用height数组。把排序后的后缀数组分成若干组,其中每组的后缀之间的height值都不小于k。容易看出,有希望成原创 2015-01-22 16:54:50 · 969 阅读 · 0 评论 -
学习笔记----后缀数组
学习资料:IOI2009国家集训队论文——《后缀数组》论文里面写的比较清晰了,但是代码里面没有解释,又从网上找到了一份代码的注释,解释的挺好的地址:http://www.cnblogs.com/Lyush/p/3233573.html这里是代码模板:倍增算法实现的,效率很高。const int maxn = 10010;int wa[maxn], wb[maxn],原创 2015-01-22 11:29:53 · 1147 阅读 · 0 评论 -
POJ 3415 Common Substrings(后缀数组求重复字串)
题目大意:给你两个字符串,让你求出来两个字符串之间的重复子串长度大于k的有多少个。解题思路:先说论文上给的解释:基本思路是计算A的所有后缀和B的所有后缀之间的最长公共前缀的长度,把最长公共前缀长度不小于k的部分全部加起来。先将两个字符串连起来,中间用一个没有出现过的字符隔开。按height值分组后,接下来的工作便是快速的统计每组中后缀之间的最长公共前缀之和。扫描一遍,每遇到一个B的后缀就统原创 2015-01-27 10:57:29 · 1052 阅读 · 0 评论 -
SPOJ 687. Repeats(后缀数组求最长重复子串)
题目大意:给你一个串让你求出重复次数最多的连续重复子串的重复次数。解题思路:论文上给出的解答是:这还没完,因为经过这两个点的情况还不完备,应还可以假设起点在 [ i*j-i+1, i*j-d],其中 d = i-L/i (d = i-L%i)其意义为根据已知的匹配长度,可以将起点往前移动的范围,太靠后将不能够构造出比之前更好的解。如果要求出某个最多的连续重复子串的最小字典序子需要枚原创 2015-01-26 15:59:20 · 1488 阅读 · 0 评论 -
POJ 3294 Life Forms(后缀数组求k个串的最长子串)
题目大意:给出n个字符串,让你求出最长的子串,如果有多个按照字典序顺序输出。解题思路:将n个字符串连起来,中间需要隔开,然后我们二分枚举字符串的长度,求最长的长度,如果多个需要按照字典序保存起来,最后输出答案就可以了。时间复杂度是:O(n*log(n))。Life FormsTime Limit: 5000MS Memory Limit: 65536K原创 2015-01-27 15:38:42 · 1148 阅读 · 0 评论 -
POJ 3693 Maximum repetition substring(后缀数组求最长重复子串)
题目大意:和spoj687类似,就是当长度相同是需要输出一个最小的字典序的序列。解体思路:这次需要枚举所有的从i到d = i-L/i (d = i-L%i)的位置,然后记录保证最大值的同时,求出来字典序最小的。Maximum repetition substringTime Limit: 1000MS Memory Limit: 65536K原创 2015-01-26 16:47:24 · 1222 阅读 · 0 评论 -
SPOJ 220. Relevant Phrases of Annihilation(后缀数组多次不重叠子串)
题目大意:给定N个串,求每个串至少出现两次的最长子串。解题思路:每个字符串至少出现两次且不可重叠的最长子串:二分枚举长度后在同一分组中对每一个字符串保留一个最小的位置和一个最大的位置,最后查看是否每个串在同一组中都有至少两个后缀,并且后缀的坐标差大于枚举的长度。POJ Problem Set (classical)220. Relevant Phrases of Annihil原创 2015-01-27 16:59:28 · 1135 阅读 · 0 评论 -
HDU 4622 Reincarnation( 任意区间子串的长度, 后缀数组+RMQ)
题目大意:给你一个字符串,给你N次查询,每次给你一个区间让你求出这个区间里面有多少子串。解题思路:我们肯定要枚举位置,然后找公共子串然后再去掉重复的,但是他的地址对应的rank不是连续的,如果暴力找的话会n*n会超时。从这个博客学习到一种方法:首先对整个字符串求一次sa[]以及height[],之后对于任意区间[L, R],遍历一遍sa[],只要起点在[L, R]内的后缀就需要进行统计,类原创 2015-01-23 19:00:25 · 1257 阅读 · 0 评论