后缀数组
varinic
这个作者很懒,什么都没留下…
展开
-
hdu 5769 Substring 2016 多校第四场
原题:后缀数组求不同子串个数 。比赛时看着bin神博客http://www.cnblogs.com/kuangbin/archive/2013/04/24/3039634.html YY了两个小时,莫名A掉。 我的做法就是算出包含X字符的所有子串数,再减去其中重复的就是答案。 #include #include #include #include typedef long long原创 2016-07-30 11:20:44 · 374 阅读 · 0 评论 -
后缀数组之高度数组
加了一点自己对高度数组的理解: height 数组:定义 height[i]=suffix(sa[i-1])和 suffix(sa[i])的最长公共前缀,也就是排名相邻的两个后缀的最长公共前缀。那么对于 j 和 k,不妨设rank[j] 则有以下性质: suffix(j) 和suffix(k)的最长公共前缀height[rank[j]+1],height[rank[j]+2], heigh原创 2016-08-01 13:58:49 · 2280 阅读 · 1 评论 -
poj 3261 Milk Patterns
求重复至少k次的最长子串。后缀数组排序,那么sa[]里面连续的k个,求k个的最长子串长度。这里用到height[]数组求,k个的最长子串长度就是height[]里面连续k-1个的最小值,那么这些最小值里面取个最大值就是ans了。 #include #include #include #include #include using namespace std; const int ma原创 2016-08-04 20:36:48 · 347 阅读 · 0 评论 -
poj 2406 Power Strings kmp next数组
求字符串最小循环节个数。有后缀数组,kmp的next数组两种求解方法,这两种方法的证明过程刚好是互逆的,证明了一种另一种也就证明了。先看后缀数组,假设循环节为k,那么s[0]与s[k]表示的后缀它们的最长公共前缀为n-k,既s[k]这个后缀刚好是s[0]这个后缀的前缀(有点绕233)。那么把s数组每k长为一段,分成n/k段(如果能整除的话)记为x1,x2,x3,......x n/k ,那么s[k原创 2016-08-05 10:33:46 · 340 阅读 · 0 评论 -
poj 1743 Musical Theme 后缀数组
首先,连续的一段可以同时加减k值,不好直接求解,但是相邻两个数同时加减k 它们的差值却是不变的,所以s[]中存的不再是题目直接给的数而是它们的差值。 比如: n=6 6个数为:1 2 3 1 2 3 s[]数组中存的则是 1 1 -2 1 1 这就转化成求不重叠最长重复子串,我们来看看这个问题怎么求解,设不重叠最长重复子串长度为len,显然长度为0至len的不重叠重复原创 2016-08-02 09:06:54 · 378 阅读 · 0 评论