后缀数组
文章平均质量分 83
alpc_qleonardo
这个作者很懒,什么都没留下…
展开
-
CodeForces - 1073G Yet Another LCP Problem(后缀数组 + 单调栈 / 分治)
大致题意 给你一个字符串SSS,然后有qqq个询问。对于第iii个询问,给出两个数字kik_iki和lil_ili序列a1,a2,...,akia_1,a_2,...,a_{k_i}a1,a2,...,aki和b1,b2,...,blib_1,b_2,...,b_{l_i}b1,b2,...,bli,让你求 ∑i=1i=k∑j=1j=lLCP(s[ai…n],s[bj…n]...原创 2019-12-03 20:05:11 · 582 阅读 · 0 评论 -
后缀数组初学 + SPOJ DISUBSTR(模板)
后缀数组是我见过的这么多算法中,最晦涩难懂的一个之一。 他本是只是几个数组,严格意义上来说不能算是一个数据结构,只是他求出来的sa[]数组和height[]在字符串统计中非常的有用。其具体的用法就先不在这里说,本文只是介绍求解的方法,并给出模板。 首先,得介绍后缀数组是什么个东西。所谓后缀数组,顾名思义就是对于一个字符串,我求出他所有的后缀的一个排名,记录到sa...原创 2018-02-28 21:20:32 · 272 阅读 · 0 评论 -
HDU 4691 Front compression(后缀数组+线段树/ST表)
大致题意,就是把一些字符串压缩,如果第i个子串与第i-1个有前缀相同的,那么可以表示为 x string 的形式,即lcp长度加上不同部分。现在,问你这样子压缩之后和压缩之前各有多少个字符(空格和换行符也要算上)。 根据一个简单的定理,这个在求height数组的时候貌似有些资料提到过,lcp(i,j)=min(h[k] | i<k<=j),即排名第i和第j的两个后缀,他们的lcp为二者的左开右闭区间的height[Rank[]]数组的最小值。有N个这样的子串,我们只需要做N次这样的区间最小值即可。而求区间最原创 2018-03-01 20:38:04 · 346 阅读 · 0 评论 -
HDU 6194 String ACM/ICPC 2017 Shenyang Online(后缀数组+容斥原理+线段树/ST)
据说这题是另一道SPOJ的一道后缀自动机的弱化版,好腻害的样子……这里用后缀数组解。 大致题意,给你一个字符串,然后问你在这个字符串中,恰好出现k次的不同子串有多少个(可以相互重叠)。 首先明确所有后缀数组题目都很重要的一点,即所有子串都是某个后缀的前缀,大部分都可以转化为lcp的问题。然后我之前在POJ上做了一道题,没有写博客,是求一个字符串中最长的出现至少k次的子串的长度(POJ 3261)。这两道题目类似,在求至少k次的时候用的是同样的方法。 对于这个出原创 2018-03-03 10:52:36 · 288 阅读 · 0 评论 -
POJ 3693 Maximum repetition substring(后缀数组+RMQ)
此题也是一道非常之巧妙的后缀数组题目。 大致题意,就是求一个字符串的最多连续出现的子串,即一个子串,可以分成最多个相同的循环节的组合。 对于本题,我一开始有一个想法,根据之前做题累积的经验套路,我们可以枚举重复次数,然后再枚举一个开始节点,求区间rmq,如果大于0,那么就是一个可能的解。但是显然这样子有重大的问题。首先,忽视了这个“连续”,求区间rmq可以求出出现至少k次的最大长度,但是这个出现k次并不一定是连续的。举个例子说,ababac,有后缀ababac、abac、ac原创 2018-03-03 11:24:15 · 284 阅读 · 0 评论 -
POJ 3415 Common Substrings(后缀数组+单调栈)
非常有意思的而且巧妙的一道题目,其实更多的是考思维。 大致题意,给你两个字符串,问你在这两个字符串中,有多少个长度大于k的公共子串,这里重复的要多次计算。 对于多个字符串的题目,为了用上后缀数组,通用的做法是把几个字符串用一个没有在任何一个串中出现的字符连接起来,之后再用后缀数组。这题显然也得先这样,然后根据height数组进行分组。对于height大于等于k的,显然可能是一个公共子串。现在就来考虑如何统计个数。最暴力的方法当然是直接枚举,枚举A中的一个后缀和B中的一个后缀,然原创 2018-03-05 16:07:28 · 303 阅读 · 0 评论 -
HDU 5853 Jong Hyok and String(二分+后缀数组/广义后缀自动机)
大致题意,给你很多个串,然后给你很多个询问,每个询问对应给出一个子串,问有多少个子串在之前给的串中的出现位置与这个的出现位置完全相同。 对于这道题目,考虑出现位置相同,也即出现次数相同。如果我们考虑用后缀数组,那么显然,求出SA数组之后,如果某个子串被包含询问串或者被包含(询问串是该串的后缀或者该串是询问串的后缀),而且出现次数与询问出现次数相同,则这个子串一定是满足条件的串。那么问题的关键就是如何求这些串的次数 由于询问串是所求串的后缀,为了利用后缀数组的性质,我们干脆把这原创 2018-03-26 23:58:19 · 372 阅读 · 0 评论 -
CodeForces 1051E Vasya and Big Integers(dp + 树状数组 + 字符串哈希/后缀数组)
大致题意:给你一个很大的数字,然后你可以把这个数字拆分成为任意多个部分,要求每一个部分的数字大小要在一个区间内,问有多少种拆分方式。 由于是给定数字的拆分,所以区间对于拆分的限制,仅仅是限于长度。也即如果拆分的部分的长度介于上界和下界的长度之间,那么直接查分即可。如果长度等于上界或者下界,那么需要按位比较于界限的大小。可以看到,这个过程相当于一个转移的过程,很自然而然的想到用...原创 2018-09-24 12:33:42 · 640 阅读 · 0 评论