摘要: 题意:给定一个字符串,求至少出现k 次的最长重复子串,这k 个子串可以重叠。分析:先二分答案,然后将后缀分成若干组。不同的是,这里要判断的是有没有一个组的后缀个数不小于k。如果有,那么存在k 个相同的子串满足条件,否则不存在。这个做法的时间复杂度为O(nlogn)。// File Name: 3261.cpp// Author: Zlbing// Created Time: 2013年09月04日 星期三 21时21分51秒#include#include#include#include#include#include#include#include#include#include#inclu 阅读全文
posted @ 2013-09-05 22:36 z.arbitrary 阅读(239) 评论(0) 推荐(0) 编辑
摘要: 题意:找到一个字符串内长度不小于五的可不重叠的最长重复子串,子串的所有数字同时加上或减去一同一个数这时两个字串重复也算重复出现。分析:首先最所有数字作差,s[i]=s[i+1]-s[i],这样一来及时原先的字串是进行过加或减那他们的差值也会相同,所以转换为求现有s[]中大与5的最长重复字串,用后缀数组。首先由二分答案的方法将问题变成判定性的:长度大于k的重复字串有没有?然后将height数组分组,每组内的后缀之间的height都要大于k,如果每组内的后缀之间的最长公共前缀有大于k的而且这两个后缀的sa[]之差大于k就说明存在长度至少为k的不重复子串。求最长公共前缀就要用到height数组,因为 阅读全文
posted @ 2013-09-05 21:13 z.arbitrary 阅读(245) 评论(0) 推荐(0) 编辑
摘要: 引用自HH大牛的模板http://www.notonlysuccess.com/index.php/sa/// File Name: suffix.cpp// Author: Zlbing// Created Time: 2013年09月04日 星期三 19时57分46秒#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;#define CL(x,v); memset(x,v,sizeof(x));#define I 阅读全文
posted @ 2013-09-05 21:06 z.arbitrary 阅读(764) 评论(0) 推荐(0) 编辑