![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
后缀数组
文章平均质量分 60
Jozky86
这个作者很懒,什么都没留下…
展开
-
P4070 [SDOI2016]生成魔咒
P4070 [SDOI2016]生成魔咒题意:有n个字符xi,每次在S的末尾加入一个字符,(一开始S为空),每次加入xi后的不相同字串有多少个题解:做这个题首先要会后缀数组P3809 【模板】后缀排序,还要知道不同的子串如何求P2408 不同子串个数,这两个题我都有写过博客对于一个字符串,我们在其末尾加一个新字符,对这个字符串的height等变换还是很大的,整个格局都会被打乱(因为我们是后缀数组,在最后加,所有后缀都会改变)。但是如果我们在前面加,在最前面加字符,那只会额外产生一个新字符原本是原创 2021-08-23 13:57:22 · 188 阅读 · 0 评论 -
SP687 REPEATS - Repeats(暂时不会)
SP687 REPEATS - Repeats题意:给定字符串,求重复次数最多的连续重复子串题解:论文题,暂时不会,搞不清楚原理代码:原创 2021-08-23 12:37:31 · 109 阅读 · 0 评论 -
Display Substring
Display Substring题意:一个长度为n的字符串,每个字符有自己的价值,求第k小价值的不重复子串价值题解:首先众所周知,所有子串都可以用后缀的前缀来表示,这就和后缀数组扯上关系了我们可以直接二分这个价值val,然后去算大于val的不重复子串有多少个(比如有x个),如果x大于k,说明该价值的情况下存在第k小价值,那r可以缩小,否则l可以增大,这是二分过程那如果计算大于val的不重复子串有多少个,遍历后缀数组,对于每个后缀,如果其越长说明其价值越高,符合单调性,所有我们二分(没错二分套二原创 2021-08-23 00:54:09 · 194 阅读 · 0 评论 -
P4248 [AHOI2013]差异
P4248 [AHOI2013]差异题意:∑1≤i<j≤nlen(Ti)+len(Tj)−2∗lcp(Ti,Tj)\sum_{1\leq i<j\leq n}len(T_{i})+len(T_{j})-2*lcp(T_{i},T_{j})∑1≤i<j≤nlen(Ti)+len(Tj)−2∗lcp(Ti,Tj)题解:∑1≤i<j≤nlen(Ti)+len(Tj)\sum_{1\leq i<j\leq n}len(T_{i})+len(T_{j})∑1≤i<原创 2021-08-22 17:22:03 · 140 阅读 · 0 评论 -
P2408 不同子串个数
P2408 不同子串个数题意:给你一个长为 n 的字符串,求不同的子串的个数。我们定义两个子串不同,当且仅当有这两个子串长度不一样或者长度一样且有任意一位不一样。子串的定义:原字符串中连续的一段字符组成的字符串。题解:对于任何一个字串,一定是一个后缀的前缀,所以我们可以求出用后缀数组求出LCP(最长公共前缀),再求出每个后缀对答案的贡献。一个长度为n的字符串,产生的字符串的个数是n(n+1)/2个,这是总数现在我们开始考虑重复的情况:后缀sa[i-1]:aaabbdbs后缀 sa[原创 2021-08-22 15:05:48 · 628 阅读 · 0 评论 -
[JSOI2007]字符加密
题目描述喜欢钻研问题的JS 同学,最近又迷上了对加密方法的思考。一天,他突然想出了一种他认为是终极的加密办法:把需要加密的信息排成一圈,显然,它们有很多种不同的读法。例如‘JSOI07’,可以读作: JSOI07 SOI07J OI07JS I07JSO 07JSOI 7JSOI0 把它们按照字符串的大小排序: 07JSOI 7JSOI0 I07JSO JSOI07 OI07JS SOI07J 读出最后一列字符:I0O7SJ,就是加密后的字符串(其实这个加密手段实在很容易破解,鉴于这是突然想出来的,那就原创 2020-10-08 21:25:02 · 282 阅读 · 0 评论 -
P2852 [USACO06DEC]Milk Patterns G
题目描述Farmer John has noticed that the quality of milk given by his cows varies from day to day. On further investigation, he discovered that although he can’t predict the quality of milk from one day to the next, there are some regular patterns in the dail原创 2020-10-09 15:05:05 · 147 阅读 · 0 评论 -
B-Suffix Array
B-Suffix Array题意:一个字符串只含有a和b,先给出b数组的构造方式:对于每个位置i来说:如果存在一个位置j,使得j<i,且s[j] == s[i],则b[i]=i-j否则b[i]=0现在对字符串每个后缀都构造B数组,并按照字典序排序题解:参考博客题目标题就已经透露了一切,Suffix Array,说明这个题要用后缀数组来做,但是具体怎么做呢?我们会发现,化为B数组的值后,第一个a的值肯定为0,第一个b的值肯定也为0,那么从第一个a到第一个b之间肯定都是1比如“a原创 2021-01-20 23:14:47 · 202 阅读 · 0 评论 -
后缀数组(后续)
后缀数组 Height利用后缀数组快速求出2个后缀的lcp长度lcp:最长公共前缀lcp(suf(i),suf(j))记Height[l] = 排名第(l-1)后缀和排名第l后缀的lcp长度Height[l] = lcp(suf(SA[l-1]),suf(SA[l]))l = 后缀suf(i)的排名r = 后缀suf(j)的排名结论:lcp(suf(i),suf(j)) = min(Height[l+1]…Height[r] )即两个后缀的lcp = 它们排名区间中Height的最小值原创 2020-10-08 11:27:05 · 408 阅读 · 0 评论 -
Musical Theme pku1743 (后缀数组)
Musical Theme(后缀数组)题意:n个数,选取一段子序列,满足以下条件:1.长度至少为52.在数列中其他位置出现过(允许转置)3.与其他位置出现的不重叠转置:将恒定的正或负值添加到子序列上例如:n个数为1,2,3,4,5,6,7,8,9,1012345是一段子序列,那6,7,8,9,10也是,因为前者加5等于后者,且两者没有重叠题解:人是傻的,完全不会。。。虽然两段序列不相等,但是也是有关系的,他们的差分区间相同,也就是其两两之间的差值一样,这样题目就转化成不重叠的最长公共原创 2020-10-13 23:01:39 · 154 阅读 · 0 评论 -
后缀数组(讲解)
子串:从原串中选取连续的一段,即子串空串也是子串后缀:suf(k)为s(k…n)构成的子串任何子串都是某个后缀的前缀最长公共前缀 lcp(suf(i),suf(j))问题:将所有后缀suf(1),suf(2),suf(N)按照字典序从小到大排序暴力sort N2 logN二分+hash :Nlog2Ncmp函数中二分suf(i)和suf(j)的lcpreturn s[i+|lcp|] < s[j+|lcp|]------- 以上为暴力做法进入正文:SA[1]排序第1的后缀的原创 2020-10-08 10:01:58 · 188 阅读 · 0 评论 -
P2870 [USACO07DEC]Best Cow Line G
P2870 [USACO07DEC]Best Cow Line G题意:给你一个字符串,每次从首或尾取一个字符组成字符串,问所有能够组成的字符串中字典序最小的一个。题解:现在要组成字典序最小的,那我们每次就尽可能取小的我们从两端开始,如果有一端小,那肯定选小的一段。如果两端一样大,此时我们要考虑这两端后面的影响,我们要尽可能选后面较小的,比如图中蓝色一样,但是紫色比橙色小,那我们两端优先取右侧蓝色,因为这样可以保证后面取得小那么如何比较两端这个大小,我们可以将字符串翻转一倍,这样就相当于比两个原创 2021-08-22 12:21:43 · 191 阅读 · 0 评论