![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
字符串_后缀数组
TouchDreamer
这个作者很懒,什么都没留下…
展开
-
后缀数组模板(详细理解)
后缀数组 后缀数组看了很久了,从基数排序开始看一只看到height数组的实现也理解了很多东西,不过别人的东西再多也不是自己的,因此自己重新总结了一下,顺便学一个后缀数组的模板备用,这里以SPOJ 694为例。#include <ctime>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>原创 2016-08-29 20:14:12 · 381 阅读 · 0 评论 -
后缀数组之细节问题理解
之前发过一篇关于后缀数组的东西,但是不够详细,注释足够详细,但是究其原理可能还是会有所不懂,因此我把我的学习过程讲述一下,首先肯定是要学习基数排序,这个我之前在别人的博客上看到一个例子感觉非常不错,自己也用这个例子反复模拟了很久,其实原理并不难,也很容易懂,但是千万要注意自己一定要手推一遍,不然一下细节问题在你自己默写代码的时候很容易暴露出来。这里给出我学习基数排序的代码(大家可以利用输出中间结果的原创 2016-08-31 21:25:02 · 232 阅读 · 0 评论 -
POJ 1743 Musical Theme(后缀数组)
题目分析 本题使用height数组的性质进行解题,自己想了很久终于想明白了。因为这道题求的是不能重复的最长公共子串,因此处理起来相比较直接求最长公共子串难一些。首先肯定是自己写模板了,把height数组建立起来,然后我们就可以二分得出结果了(通过不断二分枚举不重叠子串的最大长度),二分查找的细节我的代码给了注释。大家会发现后来我们输出的结果是ans+1,因为我们最初求最长公共子序列用到的是后一个原创 2016-09-01 17:33:46 · 276 阅读 · 0 评论 -
POJ 3261 Milk Patterns
题目分析 给出一个序列,求重复K次的最长子串。很明显后缀数组构造出来,然后利用height数组的性质,通过二分枚举,找到有没有一个连续的区间[i,j]中所有的height值都大于等于mid。这样很容易就得出答案了。#include <ctime>#include <cstdio>#include <cstring>#include <iostream>#include <algorit原创 2016-09-07 21:58:20 · 193 阅读 · 0 评论 -
HDU 5769 Substring(后缀数组)
题目分析 说实话前面之所以想搞后缀数组,一个是因为有了它,加上以前学的kmp和AC自动机,大部分的字符串的题目都可以解决了,第二就是看到了多校集训上面有后缀数组的题目,因此自己也向学习一下,毕竟多校的题目是区域赛的难度。 首先我们回忆一下前一天发的模板上讲的求单个子串的不重复子串个数,很明显对于每一个sa[i]后缀,它的起始位置sa[i],那么它最多能得到该后缀长度个子串(n-sa[i]个原创 2016-09-08 12:09:41 · 231 阅读 · 0 评论 -
后缀的最长公共前缀(lcp(x,y))
分析 这是height数组的最基本性质之一。具体的可以参看罗穗骞的论文。后缀i和后缀j的最长公共前缀的长度为它们在sa数组中所在排位之间的height值中的最小值。这个描述可能有点乱,正规的说,令x=rank[i],y=rank[j],x#include <cmath>#include <cstdio>#include <cstring>#include <iostream>#inclu原创 2016-11-08 17:58:23 · 1855 阅读 · 1 评论 -
hihoCoder #1403 : 后缀数组一·重复旋律
题目分析 后缀数组基础题目,肯定要把height数组找出来,然后从前往后扫一下,每k个需要找一个最小值,这里我用了单调队列优化,队列中一直保存着k个元素的最小元素,但是这里需要之一的一点,每一个height[i]值表示sa[i-1]与sa[i]的最长公共前缀,因此单调队列只用维护k-1个值即可。#include <cmath>#include <queue>#include <cstdio原创 2016-11-08 18:55:08 · 275 阅读 · 0 评论 -
hihoCoder #1407 : 后缀数组二·重复旋律2
题目分析 如提示的那样,二分长度,然后进行判断即可。。#include <cmath>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int maxn = 1e5+100;int s[maxn];int sa[maxn],t[ma原创 2016-11-08 19:59:30 · 402 阅读 · 0 评论 -
hihoCoder #1415 : 后缀数组三·重复旋律3
题目分析 将2个串连起来,中间加分隔符’#’,然后直接从头到尾枚举一遍height值,如果前面在一个穿,后面再另一个串,那么很明显这个height值是可以计算的,找出满足这样条件最大的即可。#include <cmath>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using na原创 2016-11-08 20:26:41 · 385 阅读 · 0 评论