题目:给定一个字符串,求出最长重复子串。
这个题目可以用后缀数组来解:对后缀数组排好序,这样重复的子串就在相邻的后缀中找就可以了。我的C++代码实现如下:class Solution
{
public:
string LongestRepeatingSubstring(string str)
{
size_t len = str.size();
vec...
分类:
编程语言 时间:
2015-03-31 22:29:32
阅读次数:
202
参考:http://www.ahathinking.com/archives/124.html最长公共子序列1、动态规划解决过程1)描述一个最长公共子序列 如果序列比较短,可以采用蛮力法枚举出X的所有子序列,然后检查是否是Y的子序列,并记录所发现的最长子序列。如果序列比较长,这种方法需要指数级时间....
分类:
编程语言 时间:
2015-03-18 23:05:17
阅读次数:
370
题意:
有N(1
“主题”是整个音符序列的一个子串,它需要满足如下条件:
1.长度至少为5个音符
2.在乐曲中重复出现(可能经过转调,“转调”的意思是主题序列中每个音符都被加上或减去了同一个整数值。)
3.重复出现的同一主题不能有公共部分。
思路:是要求最长不重叠重复的子串,如果没有不重叠的限制条件,那么height中的最大值即可
现在对于这题需要二分出答案,二分出最长重复子串...
分类:
编程语言 时间:
2015-03-17 21:58:38
阅读次数:
162
题目大意:给你一个串让你求出重复次数最多的连续重复子串的重复次数。
解题思路:论文上给出的解答是:
这还没完,因为经过这两个点的情况还不完备,应还可以假设起点在 [ i*j-i+1, i*j-d],其中 d = i-L/i (d = i-L%i)其意义为根据已知的匹配长度,可以将起点往前移动的范围,太靠后将不能够构造出比之前更好的解。如果要求出某个最多的连续重复子串的最小字典序子需要枚...
分类:
编程语言 时间:
2015-01-26 17:10:25
阅读次数:
296
题目大意:和spoj687类似,就是当长度相同是需要输出一个最小的字典序的序列。
解体思路:这次需要枚举所有的从i到d = i-L/i (d = i-L%i)的位置,然后记录保证最大值的同时,求出来字典序最小的。
Maximum repetition substring
Time Limit: 1000MS
Memory Limit: 65536K
...
分类:
编程语言 时间:
2015-01-26 17:03:45
阅读次数:
175
这也是一道例题给定一个字符串,求至少出现 k 次的最长重复子串,这 k 个子串可以重叠。算法分析:这题的做法和上一题差不多,也是先二分答案,然后将后缀分成若干组。不同的是,这里要判断的是有没有一个组的后缀个数不小于 k。如果有,那么存在k 个相同的子串满足条件,否则不存在。这个做法的时间复杂度为 O...
分类:
编程语言 时间:
2015-01-26 11:37:26
阅读次数:
238
后缀数组的用处:快速求出两个后缀Suffix(i), Suffix(j)的最长公共前缀(LCP, Longest Common Perfix)以下一张图片可谓简洁明了。下面贴上模板1.求最长重复子串,可以重叠void solve_duplicate_substr(int n){//duplicate...
分类:
编程语言 时间:
2015-01-25 15:04:43
阅读次数:
311
后缀数组(至少重复k次的可重叠的最长重复子串)...
分类:
编程语言 时间:
2015-01-25 13:56:16
阅读次数:
210
题目大意:给出n个数字。首先将这n个数前后做差,得到另一个长度是n-1的序列。求出这个序列的最长重复子串,且这些子串不能重叠。
PS:这题论文上有解析。
解题思路:先二分答案,把题目变成判断性问题:判断是否存在两个长度为k的字串是否相同的,且不重叠。解决这个问题的关键还是利用height数组。把排序后的后缀数组分成若干组,其中每组的后缀之间的height值都不小于k。
容易看出,有希望成...
分类:
编程语言 时间:
2015-01-22 18:08:28
阅读次数:
238
http://poj.org/problem?id=1743题意:不可重叠最长重复子串,n#include using namespace std;const int N=20015;void sort(int *x, int *y, int *sa, int n, int m) { static ...
分类:
其他好文 时间:
2015-01-12 22:17:25
阅读次数:
153