后缀数组
文章平均质量分 74
wxfwxf328
这个作者很懒,什么都没留下…
展开
-
poj2774 Long Long Message && hdu 1403 Longest Common Substring 最长公共字串【后缀数组(倍增)】
参考自2009年国家集训队论文《后缀数组——处理字符串的有力工具》(罗穗骞) 将串a与串b连接后用后缀数组求最大height #include #include using namespace std; const int maxn=200000+10; int sa[maxn],rank[maxn],height[maxn],num[maxn]; int wa[maxn],wb[max原创 2012-02-17 21:32:29 · 1371 阅读 · 1 评论 -
spoj 694&&705 后缀数组
每个子串一定是某个后缀的前缀,那么原问题等价于求所有后缀之间的不相同的前缀的个数。如果所有的后缀按照 suffix(sa[1]), suffix(sa[2]),suffix(sa[3]), …… ,suffix(sa[n])的顺序计算,不难发现,对于每一次新加进来的后缀 suffix(sa[k]),它将产生 n-sa[k]+1 个新的前缀。但是其中有height[k]个是和前面的字符串的前缀是相同原创 2012-03-22 10:34:01 · 748 阅读 · 0 评论 -
poj 3261 Milk Patterns 【后缀数组】
给定一个字符串,求至少出现 k 次的最长重复子串,这 k 个子串可以重叠。 算法分析: 这题的做法和上一题差不多,也是先二分答案,然后将后缀分成若干组。不同的是,这里要判断的是有没有一个组的后缀个数不小于 k。如果有,那么存在k 个相同的子串满足条件,否则不存在。这个做法的时间复杂度为 O(nlogn) #include #include #include using namespace原创 2012-03-22 10:38:21 · 717 阅读 · 0 评论 -
poj 1743 Musical Theme 【后缀数组】
有希望成为最长公共前缀不小于 k 的两个后缀一定在同一组。然后对于每组后缀,只须判断每个后缀的 sa 值的最大值和最小值之差是否不小于k。如果有一组满足,则说明存在,否则不存在。 #include #include #include using namespace std; const int maxn=20100; int a[maxn],b[maxn],s[maxn],c[maxn]; i原创 2012-03-22 10:40:39 · 500 阅读 · 0 评论 -
后缀数组——罗穗骞倍增算法详细注释
#include const int maxn=100010; int wa[maxn],wb[maxn],wv[maxn],ws[maxn]; int cmp(int *r,int a,int b,int l) {return r[a]==r[b]&&r[a+l]==r[b+l];} //就像论文所说,由于末尾填了0,所以如果r[a]==r[b](实际是y[a]==y[b]),说明待合并的两原创 2012-05-24 21:09:05 · 7296 阅读 · 0 评论