![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
后缀数组
Dan__ge
Today is difficult,tomorrow is more difficult,but the day after is beautiful.
展开
-
POJ 1743 后缀数组
点击打开链接题意:问最长的两段连续子串的长度,且两段不重复,这两段可以是这样的第一段的每个数字加或减同一个数,形成的第二段思路:先将数字的差值计算出来,求后缀数组和高度数组,二分长度求出最长的,二分成功的条件为若二分值为mid,则对于有相同的公共前缀的长度大于mid的所有串中,最远距离减去最近距离的差值大于等于mid即可,具体看代码#include #include #include原创 2016-05-16 13:55:36 · 970 阅读 · 0 评论 -
HDU 5769 后缀数组
点击打开链接题意:给一个字符,下面一个串,问你下面的串可以组成的子串中有多少个包含这个字符的思路:比较简单的一个后缀数组,比赛的时候因为卡在了其他题上,就只看了一眼,并没有写,赛后补上感觉真的很简单,因为后缀数组可以处理重复子串所以我们直接用它的sa和height数组就行了,因为要满足有给定的字符,所以我们将sa[i]代表的串里有这个字符的全部标记起来,只有这些才会对我们的结果有贡献值,然原创 2016-07-29 10:28:58 · 1512 阅读 · 0 评论 -
HDU 3518 后缀数组
点击打开链接题意:给一个字符串,问你有多少个子串重复出现过并且这两个串没有重复的地方思路:数据范围比较小,暴力的后缀数组即可,先求出sa和lcp数组,然后枚举这个重复的串的长度,枚举到len/2就可以了,然后判断条件是有lcp的值大于这个枚举长度并且位置的差值要大于等于枚举的长度,注意下边界的处理就能过了#include #include #include #include #in原创 2016-06-20 13:38:02 · 1040 阅读 · 0 评论 -
HDU 4622 后缀数组+RMQ
点击打开链接题意:给一个字符串,有q次询问,为你从第L个到第R个字符组成的不同的子串的数量思路:做过好多这种提问的了,减去的数量就是lcp[i]的值,不过这个是一个区间内的操作,正解是后缀自动机,然而还没学~~~,发现对于n*q*log应该没什么问题,就写了写,对于询问的这个区间,我一开始写的是跑sa数组,如果sa[i]在L和R区间内,那么加进去,与下一个在这个区间的sa进行RMQ查询最长原创 2016-06-12 19:50:12 · 1875 阅读 · 0 评论 -
POJ 3294 后缀数组+二分
点击打开链接题意:先是问你大于n/2个串的最长公共子串的长度,然后在这个长度的基础上,有多少子串是符合的,按字典序输出思路:先将最长公共子串的长度求出来,然后再跑一遍,将长度符合的找出来输出就行了,PS:昨天晚上调了几个小时的bug,妹的根本就不需要自己排序,用后缀数组先符合的肯定是字典序最小的嘛,蠢死的节奏,还有就是对于每一组的前缀我们只要第一个,这个也只需要标记一下即可,后者想不到的话原创 2016-05-20 08:55:50 · 828 阅读 · 0 评论 -
HDU 5558 后缀数组
点击打开链接题意:从第一个字符开始,找到一个从0到当前位置i之前的与i开始的字符串的最长匹配长度及位置,长度相同时,要位置小的,若存在,位置+最长长度,否则+1思路:15年合肥的现场题目,据说牌子发不完了,这道题的题目数据变弱后才可以将牌子发光,HDU的应该也是弱数据的版本,但是也不太好处理,看了大牛的思路才自己照着样子写了写,大牛的做法,其实我就是完全的按照神犇的做法写的,大家可以去看他原创 2016-06-01 17:01:40 · 1140 阅读 · 0 评论 -
POJ 3450 3080 后缀数组+二分
点击打开链接题意:问所有串的最长公共子序列思路:后缀数组处理两个串的最长公共子序列用后缀数组非常简单就可以完成,这个多串的也一样,和两个串的处理方式相同,不多说#include #include #include #include #include using namespace std;typedef long long ll;const int inf=0x3f3原创 2016-05-19 12:22:54 · 741 阅读 · 0 评论 -
POJ 1509 后缀数组
点击打开链接题意:给个串问最小的后缀,但是这个串是个环思路:是个环也好处理,那么就将串复制一遍加到后面就行了,然后求出后缀数组和高度数组,刚开始我写的是就求出后缀数组sa,然后从排名第1开始找,比如找到了I,排名为I的从第sa[I]开始,那么如果这个值小于输入串的长度,直接输出就行,提交WA,看了看讨论,有这样的数组,aaaa那么应该输出1,而那个程序输出4,然后想到用高度数组,刚开始找到原创 2016-05-08 16:09:49 · 1052 阅读 · 0 评论 -
POJ 3261 后缀数组
点击打开链接题意:求最长的出现k次的子串的长度思路:连着做了几道后缀数组的题目,这题A的也很顺利,既然是找最大最小这种,二分无疑最好用,那么就是判断条件了,我YY了一下,没有证明对不对就交了一发,还好对了,二分判断条件是对所有的高度数组lcp来遍历,找连续的大于mid的长度的个数,多于k-1就可以返回1,不然返回0,就完事了,复杂度N*logN#include #include #in原创 2016-05-07 14:50:37 · 1024 阅读 · 0 评论 -
POJ 2217 后缀数组
点击打开链接题意:求最长公共子序列思路:和2774差不多的题,基本没动过,但是为什么过的人这么少呢,没多想交了一发,过了,看了看时间0ms,空间264K,好象不错唉,看看排行榜,卧槽,吓了自己一跳,第一什么情况,这还是第一次拿到这个,赶紧和队友炫耀了一番,上一次在51nod上和队友一起做了一道题,我先写完的,拿了第一,然后队友写完,比我快了10几ms,被他抢走个第一,纪念一下#includ原创 2016-05-07 13:51:24 · 899 阅读 · 0 评论 -
POJ 2774 后缀数组水题
点击打开链接题意:求两个串的最长公共子串思路:用后缀数组和高度数组简单求出,结果就是高度数组的最大值,看代码,对了开始吐槽.....挑战程序设计上的后缀数组这部分,代码简单易懂,我都看懂了.......然后呢这题我用挑战程序设计的模版写完跑了2047ms,看了看status,嗯什么情况,别人怎么300~400ms,难道模版不行,还真的是,据说是因为快速排序的原因,也只有这个原因了,将模版变原创 2016-05-07 13:27:05 · 1630 阅读 · 0 评论 -
SPOJ 694&705 后缀数组
点击打开链接题意:问一个串的子串可以有多少种,就是将重复的去掉思路:每个子串一定是某个后缀的前缀,对于某个后缀sa来说,它的最长前缀就是重复的个数,那么减去就好,而最长前缀可以通过后缀数组的sa数组线性求出#include #include #include #include #include using namespace std;typedef long long ll原创 2016-05-07 11:47:16 · 1262 阅读 · 0 评论 -
POJ 3581 后缀数组
点击打开链接题意:将一个数列分成连续的三段,每段必须有数字,问这三段反转后的数列的最小字典序的方案,并输出,注意:第一个数比后面所有都大思路:因为第一个数最大,那么将整个数列反转后的字典序最小的后缀为第一段分开位置,但是要判断情况,如最后还要至少剩下两个数完成后两段,接下来找第二段的分开位置,不可以像刚刚那么找了,想这个例子,将第一段去掉后是这样的,1 3 2 1 100 如果和第一次一样原创 2016-05-06 20:14:11 · 945 阅读 · 0 评论 -
POJ 3693 后缀数组+RMQ
点击打开链接题意:问连续重复部分最多的串是什么,不能重叠,且我们要字典序最小的串如xbcabcab,有bcabca重复次数为2,cabcab重复次数也为2,那么要前边那个思路:以前写过一个类似的,SPOJ 687,这个只是求连续重复部分最多的串的次数,并不需要将按字典序最小串输出,那么我们可以用到SPOJ687的代码,用它我们可以求出那个重复的次数和满足这个次数的串的长度,那么就只差找到字原创 2016-05-16 16:55:23 · 3150 阅读 · 0 评论 -
SPOJ 687 后缀数组+RMQ
点击打开链接题意:问给出的串中连续重复的子串的最长的长度思路:先将后缀数组和高度数组先求出来,分别为sa和lcp数组。,然后用RMQ的ST算法将从位置i和j开始的后缀的最长公共前缀求出来,这个还好理解把,对与排名第一的后缀,它的高度数组为与排名第二的后缀的最长公共前缀,依次类推,比如到第四个,前四个分别为5,3,0,2;那么第一个与第三个的公共前缀就为0,以第二个为媒介,第二个与第原创 2016-05-07 21:21:06 · 1837 阅读 · 0 评论 -
HDU 4436 后缀数组
点击打开链接题意:给n个串,求所有的子串去重后相加对2012取余的值思路:思路借鉴这篇博客,其中有一个求一段串可以形成的和有点类似与字符串hash的想法,用的很巧,要用后缀数组的话不同两个串的连接需要用一个其他的数字,然后正常计算sa和height,然后当遇到的第i个是加的那个数字或者是0都不计算,因为题目说前导不能为0,然后i+height[Rank[i]]要小于i所在的串的结束位置,然原创 2016-10-06 20:55:56 · 396 阅读 · 0 评论