
后缀数组
A_root_A
这个作者很懒,什么都没留下…
展开
-
codeforces E - Martian Strings 后缀数组
题意:一个主串s,q个短串w,问有多少个短串使得w [1..i]和w [i + 1..end]都出现在s中,而w [1..i]出现在w之前[i + 1..end](没有重叠) 题解: 只要考虑w [1..i]的最左侧出现和w [i + 1..end]的最右侧位置就行了。因此,记g[j][i]是第j个串,w [1..i]在s中最左边出现的位置,而f[j][i]是第j个串,w [i + 1..e...原创 2019-11-26 19:40:03 · 306 阅读 · 0 评论 -
hdu 6704 后缀数组+RMQ+主席树
今年CCPC的第一场网络赛,到现在才补掉。。。 当时还没学后缀数组,AC自动机,然后赛场上觉得这题一定是用其中一个算法做的,搜AC自动机是干什么的,偶然就查到一道类似的可以解决这种题的模板,然后直接学习AC自动机,魔改模板,还过了样例,最后wa了一下午,现在还不知道为什么wa,大概是AC自动机的trie树根本建不下吧。 题意:给你一个串,q个询问,问你这l到r的子串在这个串中出现了k次的起始位...原创 2019-11-16 10:46:53 · 175 阅读 · 0 评论 -
codeforces 802I. Fake News (hard) 后缀数组
题意:求一个串中,所有本质不同子串的出现次数的平方和。 题解: 对于只出现一次的串的贡献,SA[i]与SA[i−1]、SA[i]与SA[i+1]的LCP的max表示这个串的前max个是不止出现一次,所以该串的长度−max就是只出现一次的串的个数,for一遍,求出每个sa[i]对应的贡献加起来即可 对于出现多次的串的贡献。 对于i,l[i]表示左边第一个数使height[l[i]]&...原创 2019-11-08 14:36:03 · 251 阅读 · 0 评论 -
codeforces 452E. Three strings 后缀数组
题意:给三个串s1,s2,s3,对于每个长度L(1<=L<=min(length(s1,s2,s3)))求有多少个三元组<p1,p2,p3>使得s1[p1...p1+L-1]==s2[p2..p2+L-1]==s3[p3..p3+L-1],求出所有L对应的答案对1e9+7取模。 题解: 先把串连在一起,记录每个位置所属的串,跑一下后缀数组求出height数组。 如果从...原创 2019-11-08 13:31:29 · 269 阅读 · 0 评论 -
Codeforces 873F - Forbidden Indices 后缀数组
题意:子串的长度*子串出现的次数为这个子串的值,求最大值。还有个约束条件串t,若t[i]=='1',则以该位置结尾的子串不能使用 题解: 把串倒转过来,这样以该位置结尾不能用的条件转化为以该位置开头的子串不能用 若先不考虑约束条件,该题的答案就是某一子串的长度*该子串出现的次数 而出现次数非常好求,根据做完后缀数组后的height[]数组来。 l[i]为i左边第一个小于height[i]...原创 2019-11-07 20:11:43 · 442 阅读 · 0 评论 -
codeforces 123D 后缀数组
题意: 给你一个串,求所有不同字串的贡献和,每种字串的贡献,k*(k+1)/2,k为该子串出现的次数 题解: aaaa这个串中,a的贡献是10,即4+3+2+1,第一个a的单独贡献为4,第二个a的贡献是3......每个串的贡献就是跟他之后的子串以及自己匹配一次。记cnt为到这一位的该子串个数,一开始为0,ans为贡献和,到1:cnt+=1,ans+=cnt;到2:cnt+=1,ans+=c...原创 2019-11-07 19:08:19 · 313 阅读 · 0 评论 -
codeforces 427D. Match & Catch 后缀数组
题意: 求a b两个串的最短公共子串长度,且这个子串在a串只出现过一次,在b串也只出现过一次 题解: 先把ab两个串连在一起形成一个新的串,中间用‘ ’空格符号隔开,用来区分两个串。 先跑一下后缀数组,利用height数组来求解。在i,向左找到第一个j1使,height[j1]<height[i],向右找到第一个j2, 使height[j2]<height[i]。j2-j1-...原创 2019-11-07 18:46:59 · 194 阅读 · 0 评论 -
Codeforces 后缀数组 题目汇总
模板1(字符串从0开始读入) const int N=2e5+10,inf=0x3f3f3f3f; int sa[N]; int rk[N]; int tmp[N]; int lcp[N]; char s[N],t[N]; int n,k; bool cmp(int i,int j){ if(rk[i] != rk[j]) return rk[i]<rk[j]; else...原创 2019-11-05 21:49:29 · 473 阅读 · 0 评论