
后缀数组
EnjoyingAC
bugger,写bug爱好者。
展开
-
Longest Common Substring HDU - 1403
题目链接HDU-1403题意给定两个字符串,求最长公共子串的长度。分析先考虑简化问题: 求在一个串中至少出现两次的最长子串。 答案就是在后缀数组中相邻的后缀的最长公共前缀。因为在后缀数组中的起始位置相距越远,他们的最长公共前缀就越小。所以只要求出高度数组的最大值即可。问题转化: 将两个字符串连接起来并在连接处添加一个字符’$’,形成新串s.这样求在s中至...原创 2018-04-14 22:24:07 · 229 阅读 · 0 评论 -
51nod 1732 婚姻介绍所 (后缀数组、RMQ)
题目题解学过后缀数组的话,读完题基本就可以直接写了。(送分题?)先求出后缀数组和高度数组,然后ST预处理lcp值的范围最小值,最后O(1)查询即可。debug: 这个送分(命)题,我写了两个神奇的bug。 第一个是每次倍增排序后确定排名时cmp内应该比较的是sa[i-1]和sa[i].因为你要比较下第i名与第i-1名是否排名相同,肯定是比较第i名的后缀而不是i后缀。 第二...原创 2018-09-13 13:04:41 · 285 阅读 · 0 评论 -
Secretary POJ - 2217 (最长公共子串问题&&后缀数组与高度数组的运用)
题目链接vjudge题目链接题意给定两个串a,b。计算两个字符串的最长公共子串的长度。分析先考虑简化问题: 求在一个串中至少出现两次的最长子串。 答案就是在后缀数组中相邻的后缀的最长公共前缀。因为在后缀数组中的起始位置相距越远,他们的最长公共前缀就越小。所以只要求出高度数组的最大值即可。问题转化: 将两个字符串连接起来并在连接处添加一个字符’$’,形成新串s....原创 2018-04-13 16:43:32 · 186 阅读 · 0 评论 -
模板总结——高度数组(LCP Array,Longest Common Prefix Array)
后缀数组模板后缀数组模板基本概念所谓高度数组,就是由后缀数组中相邻的两个后缀的最长公共前缀的长度组成的数组。设后缀数组为sa,高度数组为lcp。那么串S[sa[i]…]与串S[sa[i+1]…]的最长公共前缀的长度就是lcp[i].计算高度数组运用类似尺取法的技巧。我们从位置0的后缀开始,从前往后依此计算S[i…]与S[sa[rank[i]-1]](即后缀数组中的前一个...原创 2018-04-12 21:38:47 · 571 阅读 · 0 评论 -
Sequence POJ - 3581(后缀数组)
题目链接https://vjudge.net/problem/POJ-3581题意给定N个数字组成的序列A1,A2,…,An.其中A1比其他数字都大。现在要把这个序列分成三段,并将每段分别反转,求能得到的字典序最小的序列是什么?要求分得的每段不为空。 限制条件:N<=200000.分析因为A1最大,所有将原串反转后求后缀数组,字典序最小的合适的子串就是第一段。 ...原创 2018-04-12 17:12:04 · 242 阅读 · 0 评论 -
模板总结——后缀数组
基本概念字符串后缀:从字符串的某个位置到其末尾的字符串子串,我们认为原串和空串也是后缀。 后缀数组:将某个字符串的所有后缀按字典序排序后得到的数组,但是数组不直接存放字符串后缀,而是存放对应的起始位置。计算后缀数组基本思想是倍增。 先求出长度为2的所有子串的顺序,然后据此求出长度为4的所有子串的顺序,再然后求长度为8的子串的顺序,依此倍增。直到串的长度大于等于原字符串的长度n。...原创 2018-04-12 16:43:41 · 266 阅读 · 0 评论 -
模板总结——基于哈希的LCP问题
问题引入求第i位开始的后缀和第j位开始的后缀的最长公共前缀的长度?高度数组&&RMQ求出高度数组lcp,假设rank[i]小于rank[j],那么后缀i和后缀j的LCP值等于min{lcp[rank[i],lcp[rank[i+1],…lcp[rank[j]-1}. 预处理RMQ即可O(1)查询LCP值。但由于是预处理RMQ,无法动态回答LCP回答。也就是说一旦题目中...原创 2018-04-17 18:45:42 · 1128 阅读 · 0 评论 -
【后缀数组】Relevant Phrases of Annihilation SPOJ - PHRASES
题目链接Relevant Phrases of Annihilation SPOJ - PHRASES题意输入m个字符串,求一个最长子串,要求这个子串在每个字符串中都不重叠地出现了至少两次。输出最长子串的长度。分析求最大值最小值问题,很容易想到用二分去搜索。 binary() 返回搜索的结果 check(l) 长度为l的子串是否满足要求简化问题: 求一个字符串...原创 2018-04-17 15:54:47 · 223 阅读 · 0 评论 -
Distinct Substrings(后缀数组的运用&&高度数组的运用)
题目链接SPOJ-DISUBSTR题意给定一个字符串s,求s的所有子串不重复的个数。分析观察后缀数组,注意到子串一定是后缀数组中的后缀的前缀的一部分。即每一个后缀贡献len个子串(len是后缀的长度)。现在要去掉重复的子串,也就是去掉后缀的公共前缀,因为公共前缀贡献的子串是相同的。所以只需用所有的子串数减去公共前缀的长度和。代码#include <...原创 2018-04-15 10:50:03 · 248 阅读 · 0 评论 -
Boring counting HDU - 3518(后缀数组&&不重叠重复子串)
题目链接HDU-3518题意给定一个字符串,求不重叠且出现至少两次的子串的个数。分析先考虑计算重复子串: 虽然只是子串,但是我们可以人为的将其看成是以该子串起始的后缀。枚举子串长度,比较两个后缀的公共前缀长度是否大于等于子串长度就可以知道两个子串是否重复。然后考虑不重叠: 不重叠要求两个后缀的起始位置相差大于等于所枚举子串长度。综合考虑: 两个后缀的最长公...原创 2018-04-15 08:41:09 · 255 阅读 · 0 评论 -
2019年华南理工大学程序设计竞赛(春季赛)第K题 Parco_Love_String
题目题解后缀数组暴力水过。。。时间复杂度O(n^3)AC代码#include <bits/stdc++.h>using namespace std;const int maxn=1100;int ranka[maxn+1],tmp[maxn+1],n,k;bool compare_sa(int i,int j){ if(ranka[i]!=ranka[j]...原创 2019-04-13 21:11:53 · 308 阅读 · 0 评论