摘要: 1.求重复子串: (1).可重叠最长重复子串 做法简单,只要求出height数组中的最大值即可。首先求最长重复子串,等价与求两个后缀数组的最长公共前缀。 (2).不可重叠最长重复子串 把排序后的后缀分成若干组,其中每组的后缀之间的height值不小于k。例如,字符串为“aabaaaab”,当k=2时,后缀分成4组,如图所示: 有希望成为最长公共前缀不小于k的两个后缀一定在同一组。然后对于每组后缀,只须判断每个后缀的sa 值的最大值和最小值之差是否不小于k。如果有一组满足,则说明存在,否则不存在。 (3).子串的个数 求不相同的子串的个数。 如果所有的后缀按 suffix... 阅读全文
posted @ 2013-08-05 22:05 yongren1zu 阅读(2302) 评论(0) 推荐(0) 编辑
摘要: height数组:定义 height[i] = suffix[i-1] 和 suffix[i] 的最长公共前缀,也就是排名相邻的两个后缀的最长公共前缀。那么对于 j 和 k 不妨设 Rank[j] =h[i-1]-1. 证明: 设suffix[k]是排在suffix[i-1]前一名的后缀,则它们的最长公共前缀是h[i-1]。那么suffix[k+1]将排在suffix[i]前面(这里要求h[i-1]>1,如果h[i-1]<=1原式显然成立)并且suffix[k+1]和suffix[i]的最长公共前缀是h[i-1]-1,所以suffix(i)和它前一位的最长公共前缀至少是h[i-1] 阅读全文
posted @ 2013-08-05 21:01 yongren1zu 阅读(743) 评论(0) 推荐(0) 编辑
摘要: 暴力求解题意:求一个公共子串的最大长度,反转的公共子串存在也算。求解思路:先找出最短的字符串进行暴力枚举。每截取一个子串后,求出它的反转字符串,然后检验这两个子字符串是否存在输入的字符串组中,每个字符串只要存在子字符串和的翻转串其中一个就行。#include#include#includeusing namespace std;#define max(a,b) a>b?a:bint n,len,id;string str[110];bool check(string sub){ string tmp; int sl=sub.size(); for(int i=0;i=i;j-... 阅读全文
posted @ 2013-08-05 14:37 yongren1zu 阅读(154) 评论(0) 推荐(0) 编辑