
后缀数组
ddovetlose
这个作者很懒,什么都没留下…
展开
-
连续重复次数最多的重复子串 hdu2459 poj 3693
#include #include #include int wa[200000],wb[200000],wv[200000],wsum[200000]; int height[200000],sa[200000],rank[200000]; int n,ans,len,pos; char str[200000]; int R[200000]; int f[200000][20]; in原创 2012-03-30 10:46:39 · 1719 阅读 · 0 评论 -
最长回文子串 ural1297
算法分析(来IOI2009 国家集训队论文) 穷举每一位,然后计算以这个字符为中心的最长回文子串。注意这里要分两 种情况,一是回文子串的长度为奇数,二是长度为偶数。两种情况都可以转化为 求一个后缀和一个反过来写的后缀的最长公共前缀。具体的做法是:将整个字符 串反过来写在原字符串后面,中间用一个特殊的字符隔开。这样就把问题变为了 求这个新的字符串的某两个后缀的最长公共前缀 Suffix(原创 2012-03-21 22:00:50 · 575 阅读 · 0 评论 -
最长重复不重叠子串 poj 1743
(资料来自国家集训队论文) 把排序后的后缀分成若干组,其中每组的后缀之间的height 值都 不小于k。例如,字符串为“aabaaaab”,当k=2 时,后缀分成了4 组,如图5所示。 。然 后对于每组后缀,只须判断每个后缀的sa 值的最大值和最小值之差是否不小于 k。如果有一组满足,则说明存在,否则不存在。整个做法的时间复杂度为 O(nlogn)。 //原创 2012-03-21 18:38:47 · 1344 阅读 · 0 评论 -
不同回文子串数目 hdu 3948
将原串反向后接在后面,中间用一个没出现过的字符隔开; 如"abab";k=strlen(str); 连接后变为"abab9baba0" 根据height【】排序后 i height[i] 子串 0 0 0 1 0 9baba0 2 0 a0 3 1原创 2012-03-22 13:14:51 · 2812 阅读 · 0 评论 -
出现k次以上重复的最长子串 poj 3261
先二分答案,然后分组。只要某一组包含的后缀数量大于等于k,表示有解 //出现k次以上重复的最长子串 #include #include #include #include using namespace std; const int N=30000; int wa[N],wb[N],wv[N],wsum[N]; int height[N],sa[N],rank[N]; int n,k;原创 2012-03-22 15:01:55 · 584 阅读 · 0 评论 -
//求一个串最多由哪个串复制若干次得到 poj 2406
用kmp会很方便。 后缀数组的话枚举字符串(0,i),如果能够被n整除并且lcp(0,i+1)==n-i-1,那么答案就是n/(i+1); //求一个串最多由哪个串复制若干次得到 #include #include #include #include using namespace std; const int N=5000005; int wa[N],wb[N],wv[N],wsum原创 2012-03-22 18:49:21 · 554 阅读 · 0 评论 -
重复出现的不重叠子串数目 hdu 3518
枚举长度k,在将height数组以k分组,如果一组中最大和最小位置差>=k那么ans++; #include #include using namespace std; const int N=1005; int wsum[N],wv[N],wa[N],wb[N],sa[N],rank[N],height[N]; char str[N]; int cmp(int *r,int a,int b原创 2012-03-22 19:00:47 · 1119 阅读 · 0 评论