URAL - 1297 后缀数组的做法 LCP应用】的更多相关文章

题意:求最长回文子串 这种有专门的O(n)套板子算法,但作为练习还是用后缀数组来解吧 只需把相同的另一个串反接(中间用一个足够小且未出现的字符衔接),然后枚举回文串的中点,不断求解该点往前和往后计算的\(LCP\)即可 发现模板有个BUG改好了 有个值得注意的地方是回文长度奇偶枚举时的端点选择问题,具体直接看栗子 abcccd 奇数枚举时应该是abcccd#dcccba 偶数枚举时应该是abcccd#dcccba 两个子串枚举首端与#的距离相等或相差一,列出式子就是当奇数端枚举\(i\)时,另一…
题意:就是让你求一个字符串中的最长回文,如果有多个长度相等的最长回文,那就输出第一个最长回文. 思路:这是后缀数组的一种常见的应用,首先把原始字符串倒转过来,然后接在原始字符串的后面,中间用一个不可能出现的字符隔开.然后就用到后缀数组的性质了, 我们枚举每一个原始字符串中的字符以它为中心(分为奇数和偶数两种情况)进行查找,比如对于下标为i的字符,当回文串为奇数时,我们要求的就是i的后缀与2*n-i的 后缀的最长公共前缀了,然后根据height数组的性质就转化成求height[i+1]...hei…
思路:这题下午搞了然后一直WA,后面就看了Discuss,里面有个数组:ABCDEFDCBA,这个我输出ABCD,所以错了. 然后才知道自己写的后缀数组对这个回文子串有bug,然后就不知道怎么改了. 然后看题解,里面都是用RMQ先预处理随意两个后缀的最长公共前缀,由于不太知道这个,所以又看了一下午,嘛嘛-- 然后理解RMQ和后缀一起用的时候才发现事实上这里不用RMQ也能够,仅仅要特殊处理一下上面这个没过的样例即可了,哈哈--机智-- 解法一: 这个是不用RMQ做的: #include<iostr…
https://vjudge.net/problem/URAL-1297 题意: 给出一个字符串求最长回文子串 代码: //论文题,把字符串反过来复制一遍到后边,中间用一个没出现的字符隔开,然后就是枚举当以i位置为中间位时的最长回文串 //是多大,就是求这中间的heigh数组的最小值.用rmq预处理.枚举位置时分回文串长度是奇数还是偶数. #include<iostream> #include<cstdio> #include<cstring> using namesp…
思路: 论文题--*n 倒过来接上 分奇偶讨论 求LCP 搞棵线段树即可 //By SiriusRen #include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define N 5555 int cases,pos,maxans,n,cntA[N],cntB[N],A[N],B[N],rk[N],sa[N],tsa[N],ht[N]; char s[N]; void…
后缀数组的题博客里没放进去过..所以挖了一题写写 充实下博客 顺便留作板子.. 一个字符串S中 内容不同的子串 有 sigma{n-sa[i]+1-h[i]}   (噢 这里的h[]就是大家熟知的height[]) 所以l=1,r=上述sigma 二分 答案是字典序第几大的子串. 然后 求S中第k大的子串W : 因为h[i]是与i-1有关的 所以要从n downto 1,k-=n-sa[i]+1-h[i] 至 k再减就非正了 显然这样扫过来 子串字典序是递减的  因此可以得到第k大子串W 然后再…
前言 看这篇博客前,先去了解一下后缀数组的基本操作吧:后缀数组入门(一)--后缀排序. 这篇博客的内容,主要建立于后缀排序的基础之上,进一步研究一个\(Height\)数组以及如何求\(LCP\). 什么是\(LCP\) \(LCP\),即\(Longest\ Common\ Prefix\),是最长公共前缀的意思. 而在后缀数组中,\(LCP(i,j)\)表示后缀\(_{SA_i}\)与后缀\(_{SA_j}\)的最长公共前缀的长度,注意是\(SA_i\)和\(SA_j\),而不是\(i\)和…
    [题目链接] http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=12406 [题意] 求最长回文子串. [思路] 将字符串反向拼接在后,中间用一个没有出现的字符隔开,则问题转化为求新字符串两个特定后缀的lcp,枚举对称点i,对称数为奇的情况对应求lcp(i,n-i),对称数为偶的情况对应求lcp(i,n-i-1). 如图所示: 两个后缀的lcp可以用Sparse Table算法(倍增)在O(nlogn)时间内求解. […
题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1297 求最长回文子串 典型的后缀数组的入门题目,但是可以用更简单的方法解决,毕竟数据量比较小啊 转载: 题目大意:给出一个字符串,求它的连续最长回文子串. 分析:这题数据规模不大(n<=1000),所以直接暴力可以解决.不过如果数据规模大了,暴力就不行了.这里介绍后缀数组的做法. 首先,枚举回文子串的中心所在位置.这里要分回文串长度为奇数和偶数两种情况考虑.这两个问题均可以转化为求一个后缀…
[BZOJ4566]找相同字符(后缀数组) 题面 BZOJ 题解 后缀数组的做法,应该不是很难想 首先看到两个不同的串,当然是接在一起求\(SA,height\) 那么,考虑一下暴力 在两个串各枚举一个后缀,他们的\(lcp\)就是对答案产生的贡献 现在优化一下,按照\(SA\)的顺序枚举来处理\(lcp\) 利用一个单调栈维护一下,每次记录一下前面有多少个的贡献和当前答案一样就好啦 只是有点难写... #include<iostream> #include<cstdio> #in…