后缀数组
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 · 1697 阅读 · 0 评论 -
最长回文子串 ural1297
算法分析(来IOI2009 国家集训队论文)穷举每一位,然后计算以这个字符为中心的最长回文子串。注意这里要分两种情况,一是回文子串的长度为奇数,二是长度为偶数。两种情况都可以转化为求一个后缀和一个反过来写的后缀的最长公共前缀。具体的做法是:将整个字符串反过来写在原字符串后面,中间用一个特殊的字符隔开。这样就把问题变为了求这个新的字符串的某两个后缀的最长公共前缀Suffix(原创 2012-03-21 22:00:50 · 548 阅读 · 0 评论 -
最长重复不重叠子串 poj 1743
(资料来自国家集训队论文)把排序后的后缀分成若干组,其中每组的后缀之间的height 值都不小于k。例如,字符串为“aabaaaab”,当k=2 时,后缀分成了4 组,如图5所示。。然后对于每组后缀,只须判断每个后缀的sa 值的最大值和最小值之差是否不小于k。如果有一组满足,则说明存在,否则不存在。整个做法的时间复杂度为O(nlogn)。//原创 2012-03-21 18:38:47 · 1297 阅读 · 0 评论 -
不同回文子串数目 hdu 3948
将原串反向后接在后面,中间用一个没出现过的字符隔开;如"abab";k=strlen(str);连接后变为"abab9baba0"根据height【】排序后i height[i] 子串0 0 01 0 9baba02 0 a03 1原创 2012-03-22 13:14:51 · 2789 阅读 · 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 · 562 阅读 · 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 · 533 阅读 · 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 · 1083 阅读 · 0 评论