
后缀数组【SA】
poursoul
这个作者很懒,什么都没留下…
展开
-
【POJ】3693 Maximum repetition substring 【后缀数组——求最长连续重复字串】
传送门:【POJ】3693 Maximum repetition substring题目分析:这个主要是看后缀数组的神论文了解的。。。。对于枚举的长度L,如果存在连续重复子串,则对于s[0],s[L],s[2*L],……,来说,一定存在相邻两个s[i*L],s[i*L+L]使得lcp(i*L,i*L+L)>=0,此时设M=lcp(i*L,i*L+L),很显然存在一个重复次数为M/L原创 2014-12-16 11:13:46 · 822 阅读 · 0 评论 -
【UVALive】7502 Suffixes and Palindromes【根据sa数组以及回文半径数组构造字典序最小的串】
题目链接:【UVALive】7502 Suffixes and Palindromes根据回文半径数组能得出一堆不等相等关系,相等缩点,不等建边。 根据sa数组的对偶数组rank数组的性质,考虑sa[i]和sa[i-1],如果如果rank[sa[i]+1]>rank[sa[i-1]+1]则s[sa[i]]可以等于s[sa[i-1]];如果rank[sa[i]+1]>rank[sa[i-1]+1]则原创 2016-12-06 12:13:30 · 1076 阅读 · 0 评论 -
【HDU】5906 Square Revolution【后缀数组+RMQ求LCP+并查集+扫描线+树状数组】【求以某个点为开始或者结尾的最短AA形式串的长度】
题目链接:Square Revolution题意:求串s有多少个子串满足不存在形式为AA的前缀或后缀(其中A是一个字符串)。本质是求以某个点为起点或者终点的最短AA串的长度。求出这东西以后就可以询问离线+扫描线树状数组搞搞了。求最短AA串怎么求呢,我们枚举A的长度k,然后看i和i+k的lcp(最长公共前缀)和lcs(最长公共后缀)是否加起来大于等于k,是的话用他们更新一下被影响的每个点的信息(即以他原创 2016-10-08 11:36:36 · 845 阅读 · 0 评论 -
【codeforces】Codeforces Round #305 (Div. 1)E. Mike and Friends【后缀数组+线段树】
传送门:【codeforces】Codeforces Round #305 (Div. 1)E. Mike and Friends题目分析:这题用后缀数组来做,十分直观(另一个原因是我后缀自动机并不会,只做过一道模板题,性质都不知道)。我的方法是O(nlog2n)O(nlog^2n),O(nlogn)O(nlogn)的方法就是把线段树换成主席树来实现(不想再改了)。首先将串接在一起,然后用后缀数组得原创 2015-05-27 19:20:57 · 1161 阅读 · 0 评论 -
【Live Archive】4671 - K-neighbor substrings【FFT+后缀数组】
传送门:【Live Archive】4671 - K-neighbor substrings题目分析:和Ural 1996那题很像,都是通过将一个串反转后就可以将匹配变成卷积了。 由于从AA串中取出来的串是本质不同的,所以这里我用了后缀数组(用后缀数组纯粹是因为我懒= =)做了处理:处理出的heightheight数组,heightiheight_i表示字典序第ii小的后缀和字典序第i−1i-1小原创 2015-05-07 16:44:15 · 1389 阅读 · 0 评论 -
【FZU】Problem 2137 奇异字符串【后缀数组】
传送门:【FZU】Problem 2137 奇异字符串题目分析:枚举x所在位置,向左右暴力扩展,lcp(L,x+1)>=x-L就累加ans。复杂度是O(nlogn+26*n),复杂度可以这么证明,假设我们以字母a为中心,那么不存在字母a的位置最多n-1个,直接枚举过去就好了,其他字母同理。my code:#include #include #include #in原创 2015-04-22 19:40:31 · 660 阅读 · 0 评论 -
【POJ】3261 Milk Patterns 【后缀数组】
传送门:【POJ】3261 Milk Patterns题目分析:构好后缀数组,然后二分答案就好了~_~代码如下:#include #include #include using namespace std ;typedef long long LL ;#define rep( i , a , b ) for ( int i = ( a ) ; i原创 2014-12-12 11:32:57 · 797 阅读 · 0 评论 -
【URAL】1297 Palindrome 【后缀数组+RMQ——求最长回文子串】
传送门:【URAL】1297 Palindrome题目分析:将s串倒过来接到原串的后面,中间用'$'隔开,然后我们构造后缀数组和height数组,接着我们RMQ预处理,接下来枚举串的每个点作为回文串的中心,分别以该点为奇回文串中心以及偶回文串中心求LCP,此时向左和向右的串的LCP即以这个点作为中心的回文串的扩展半径,求半径的话我们就对原串位置以及倒过来后的相应位置做LCP。原创 2014-12-11 22:19:44 · 1113 阅读 · 0 评论 -
【HDU】4552 怪盗基德的挑战书 【后缀数组】
传送门:【HDU】4552 怪盗基德的挑战书题目分析:答案就是所有后缀和串s的lcp长度相加。后缀数组搞定。代码如下:#include #include #include using namespace std ;typedef long long LL ;#define rep( i , a , b ) for ( int i = ( a )原创 2014-12-11 21:05:01 · 778 阅读 · 0 评论 -
【POJ】1743 Musical Theme 【后缀数组】
传送门:【POJ】1743 Musical Theme题目分析:这题和HDU3518做法差不多。首先将序列差分,然后构造后缀数组,接下来我们二分重复的串的长度k,然后看height[i]连续大于等于k的里面的最左端L是否和最右端重叠,如果不重叠则修改下界,否则如果找不到则修改上界。最后看找到的长度是否大于等于4(差分后少了一个数),有的话输出这个长度,否则输出0。代码如下:原创 2014-12-11 20:07:16 · 671 阅读 · 0 评论 -
【POJ】3294 Life Forms 【后缀数组——求在超过一半串中出现的最长串】
传送门:【POJ】3294 Life Forms题目分析:我们将所有的串合并成一个串,相邻两串中间用分隔符隔开,注意分隔符一定要用各不相同的且都不在原串中出现的。然后构造后缀数组,这个用倍增算法就好了。然后,我们二分最长串的长度k,然后扫一遍height数组,当>=k时我们统计出现在不同串的个数cnt,当n/2,是的话返回yes,否则返回no,yes的话就调整下界,否则调整上界。然后输原创 2014-12-11 11:07:57 · 734 阅读 · 0 评论 -
【POJ】3415 Common Substrings 【后缀数组+单调栈】
传送门:【POJ】3415 Common Substrings题目分析:题目要求的实质是计算 A 的所有后缀和 B 的所有后缀之间的最长公共前缀的长度,然后把最长公共前缀长度不小于 k 的部分全部加起来(即A的后缀ai和B的后缀bj的最长公共前缀为x且x大于等于k,则答案累加上x-k+1)。由于枚举所有ai和bj的话是O(n^2)的复杂度,所以我们需要一些技巧来优化。比原创 2014-12-10 21:43:56 · 1604 阅读 · 2 评论 -
【POJ】2774 Long Long Message 后缀数组
传送门:【POJ】2774 Long Long Message题目分析:后缀数组入门题。终于开始学后缀数组了。。。鸡排(基数排序)一开始不会导致学了好久。。。这题是将两个串并到一个串上,中间用一个特殊符号隔开(一般用'$'),然后在串的末尾加一个0,这样构造后缀数组的时候便不需要特殊判断了。求出height数组后,由于height[i]为第i小的后缀和第i-1小的后缀的最长公共原创 2014-12-09 15:57:11 · 801 阅读 · 0 评论 -
【HDU】3518 Boring counting 后缀数组
传送门:【HDU】3518 Boring counting题目分析:这题呢,我们先构造出后缀数组,求出height数组。然后我们枚举字符串的长度,易知【L,R】内连续的height[i]有共同的前缀,前缀的最长长度为【L+1,R】内所有height的最小值。于是我们可以枚举字符串长度d,然后对该长度找到每一个连续的区间,如果某个区间内最左端l的该前缀和最右端r的该前缀无重叠,即l+d原创 2014-12-09 20:17:39 · 691 阅读 · 0 评论 -
【HDU】4691 Front compression 后缀数组+RMQ
传送门:【HDU】4691 Front compression题目分析:首先构造好后缀数组,然后对height数组进行rmq预处理,然后每次查询就是O(1)的了。代码如下:#include #include #include using namespace std ;typedef long long LL ;#define rep( i , a原创 2014-12-09 22:32:12 · 799 阅读 · 0 评论 -
【codeforces】741E. Arpa’s abnormal DNA and Mehrdad’s deep interest【后缀数组+分块】
题目链接:【codeforces】741E. Arpa’s abnormal DNA and Mehrdad’s deep interest观察两个插入位置对他们rank的影响,可以发现,可以拆成求5段lcp,因此我们在将两个串拼接后求一个后缀数组,然后就可以直接对所有插入位置求出他们的rank了。然后询问可以根据k分块,这题就做完了。 就是需要写一会儿。#include <bits/stdc++原创 2016-12-09 14:36:42 · 2001 阅读 · 0 评论