![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
后缀数组
Spy97
这个作者很懒,什么都没留下…
展开
-
Codeforces 1073G Yet Another LCP Problem
题意给出一个字符串,提问两组位置,求两组之间两两的后缀的LCP的和题解LCP要用到rank设两组为 a[ ],b[ ]a[~],b[~ ]a[ ],b[ ]将两组的rank放到一起,排序对每个 b[i]b[i]b[i] 只考虑他前面的 a[j]a[j]a[j](反过来再搞一遍就行)已知 b[i−1]b[i-1]b[i−1] 和它前面的LCP...原创 2019-12-05 18:43:19 · 275 阅读 · 0 评论 -
ICPC World Final 2019 G First of Her Name AC自动机 树上SA 广义后缀自动机
题意给出一个字符构成的树,每个节点到根经过的字符组成一个字符串。有多个询问,每次询问一个字符串,求询问串是多少个字符串的前缀题解在树上求后缀数组,求出每个字符串的字典序的排名对于询问操作,找出询问串在字符串中的排名的区间范围,就得出答案了由于是有序的,所以可以用二分查找,前缀等于询问串的最小和最大的排名,差值就是答案注意二分查找时的边界问题:La=n+1,Ra=0La=n+1,Ra=0...原创 2019-11-06 11:29:25 · 393 阅读 · 0 评论 -
2019牛客多校第四场 string
题意定义 rev(S)rev(S)rev(S) 为串 SSS 的颠倒,如 rev(abac)=cabarev(abac)=cabarev(abac)=caba现给出一个串,在他的所有子串中,任意两个串 a,ba,ba,b,不能出现 a=b或a=rev(b)a=b或 a=rev(b)a=b或a=rev(b) 的情况,求集合的最大值题意将原串的本质不同的子串分为3种,第一种是回文串,第二种是...原创 2019-07-28 21:27:02 · 171 阅读 · 0 评论 -
2018 ICPC 焦作 H题 Can You Solve the Harder Problem?
题意:给出n个数,定义 f [ l, r ]表示 区间 [ l , r ]的最大值,求所有 子区间的最大值的和,要求相同的子区间只能算一次比如 数列 5 6 5 6 , 区间 [ 1, 2 ] 和 [ 3, 4]是一模一样的,所以只能算一次。 题解:假如抛开限制,那就是一个经典的算贡献的题目。要求重复的区间只能算一次,很容易想到 相同的子串,又联想到后缀数组...原创 2018-12-10 00:25:03 · 1839 阅读 · 0 评论 -
2018 焦作网络赛 H String and Times
题意:给出一个字符串,和一个上下界,求所有子串中出现次数恰好介于上下界的个数。题解:假设上下界为x、y,我们计算出出现次数大于k的数目cal(k),那么cal(x)-cal(y+1)就是答案。先上后缀数组板子求出rank、sa和height数组我们按rank从小到大排序,相邻k个位一组,即1~k、2~k+1、3~k+2、4~k+3。。。。。。对于1~k,假设这一组的he...原创 2018-09-19 23:57:33 · 183 阅读 · 0 评论 -
HDU 6194
string string string Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2270 Accepted Submission(s): 711Problem DescriptionUncle Mao is a...原创 2018-03-17 23:23:39 · 266 阅读 · 0 评论 -
POJ 3693
题目描述:给出一个字符串,求重复次数最多的子串。若多个,输出字典序最小的。题解:先穷举长度 L,然后求长度为 L 的子串最多能连续出现几次。首先连续出现1 次是肯定可以的,所以这里只考虑至少 2 次的情况。假设在原字符串中连续出现 2 次,记这个子字符串为 S,那么 S 肯定包括了字符 r[0], r[L], r[L*2],r[L*3], ……中的某相邻的两个。所以只须看字符 r[L*i]和 r[...原创 2018-03-04 08:35:25 · 252 阅读 · 0 评论 -
URAL 1297 最长回文子串
题目描述:给一个字符串,求最长回文子串,若有多个,输出最先出现的。注意:题目给的字符串要删去除字母外的其他字符,再进行求解。题解:设原串为s,在s尾部加一个特殊字符,然后再将s逆序添加在特殊字符的后面。一开始我的思路是直接求最长公共子串,然后出现了反例。abefba,求解是ab,但正确答案是a,错误在于忽略了位置是否对应。正解应该是,从头开始枚举s中的字符s[i],作为回文串的中间位置,分两种情况...原创 2018-03-03 00:56:10 · 197 阅读 · 0 评论 -
POJ 1743
题目描述:给一组数字串,求不可重叠的最长公共子串,如果长度大于5,输出长度,否则输出0。注意:“公共子串”的定义为,两子串的对应位置的元素的差值相同即可。如:1 2 3 和 6 7 8 即满足条件,他们对应位置的差值是2。题解:我们如果有两个满足条件的子序列a[i],a[i+1],…a[i+k]和b[i],b[i+1],…b[i+k],则有:b[i]-a[i]=b[i+1]-a[i+1]= …b[...原创 2018-03-01 23:26:16 · 287 阅读 · 0 评论 -
HDU 4691
题解:后缀数组求两个子串的LCP。用ST表求height数组中两个子串rank之间的最小值,即为子串的LCP。代码:#include<bits/stdc++.h>#define N 200010#define LL long longusing namespace std;char s[N];int sa[N],t[N],t2[N],c[N],n,rak[N],height...原创 2018-02-28 23:25:56 · 219 阅读 · 0 评论 -
HDU 1403
题目描述:给出两个字符串,求最长公共子串的长度。题解:后缀数组。将两个字符串合并成一个,中间加一个字符'0',然后求出height数组。因为以最长公共子串为前缀的子串,他们的rank肯定相差为一,然后遍历sa数组,判断sa[i]和sa[i-1]的位置是否位于字符'0'的两侧,符合条件的最大的height值即为答案。代码:#include<bits/stdc++.h>#define N...原创 2018-02-27 23:07:55 · 269 阅读 · 0 评论