随笔分类 - 后缀数组
摘要:题意:求A 串中不在 所有B串中出现大不同子串的个数分析:后缀数组可以很简单的实现求一个串不同字子串的个数,,从这方面下手就很容易想到了,之前比赛的时候,,死活没想法先将所有串拼接起来,计算不包含分隔符的不同子串的个数sumAB,再单独将所有B串拼接起来,同样的方法求一遍,得到sumB,sumAB-sumB即为所求View Code #include <iostream>#include <algorithm>#include <string.h> #include <math.h>#include <string>int const
阅读全文
摘要:重复至少俩次的不重叠子串的个数我还是觉得大牛的这句解释十分重要,还是没彻底理解透,导致今天这道题目的悲剧若在假设重复子串的长度最多为L的限制下有解, 则对于任意一个比L小的限制L'<L, 也一定有解. 这就说明存在解的连续性给出一个关于LCP的定理LCP(SA[i], SA[j]) = RMQ(Height[i+1..j]). 由此, 若存在k, 满足Height[k] < L, 则对于所有i, j 满足i < k < j, 有LCP(SA[i], SA[j]) < L. 即公共长度至少为L的两个后缀, 不会跨过一个小于L的Height低谷k, 所以我们可
阅读全文
摘要:啊,好 郁闷,这应该就是不理解模板的带来的后果吧,用之前那个模板,写了好几遍,改了好几遍,一直wa,可是换一个模板就过了,之后还是用这个模板吧题意倒是很简单,就是求出至少重复k次的最长子串还是用二分的思想,找出一组后缀数目大于等于k的最大后缀即可#include <stdio.h> #include <stdlib.h> #include <string.h> int const N= 20100; int wa[N], wb[N], ws[N*2], wv[N]; int rank[N], sa[N], height[N], r[N], n, k,m; i
阅读全文
摘要:这个地址上的题解已经好详细了http://wenku.baidu.com/view/87f5b7f80242a8956bece4df.html不过本人觉得,加上这部分题解的话,会更好理解若在假设重复子串的长度最多为L的限制下有解, 则对于任意一个比L小的限制L'<L, 也一定有解. 这就说明存在解的连续性, 这样就可以用二分查找答案长度L. 给出一个关于LCP的定理LCP(SA[i], SA[j]) = RMQ(Height[i+1..j]). 由此, 若存在k, 满足Height[k] < L, 则对于所有i, j 满足i < k < j, 有LCP(SA[i
阅读全文
摘要:嘿嘿,用大牛的代码过的,我觉得,要理解这个好难呀,但要是用了模板计算后缀数组sa[],名次数组rank[],还有height[],height[]是后缀数组的关键所在,用来模板计算出这三个数组,后缀数组的应用也就拓展得开了哦看下模板吧,不过这个版本用了657ms耶,不是很快的说#include <iostream>using namespace std;#define MAXN 200010// max{str.len,256}int b[MAXN],array[4][MAXN],*rank1,*nrank,*sa,*nsa,height[MAXN],n,len;char str[
阅读全文