
后缀数组
bestFy
世界上最最最渣的oier.
展开
-
SPOJ - SUBST1 New Distinct Substrings
题面在这里题意:给一个字符串,统计字符串中不重复的子串个数。做法:后缀数组模板题。 观察到每一个子串都是一个后缀的前缀,重复的前缀就是sigma(h[i]),第i小的和第i-1小的后缀的lcp。 于是我们把ans减去sigma(h[i])就好了。代码:#include#include#include#include#include#includ原创 2018-01-11 17:03:49 · 284 阅读 · 0 评论 -
ural1297 Palindrome
题面在这里题意:求一个串最长的回文子串。做法:首先将原串和它的反串用一个没有出现过的字符拼接起来。 跑这个大串的sa。求出height。 在原串中枚举一个中心点x,要知道x往左右两边最多能扩展多少,这个相当于求原串和反串相应后缀的lcp。 于是就可以用height+rmq实现了。 注意要按照长度奇偶分开讨论。代码:/*************************原创 2018-01-18 18:57:02 · 240 阅读 · 0 评论 -
poj3415 Common Substrings
题面在这里题意:求两个字符串中长度不小于k的公共子串个数。做法:即求sigma(两个字符串的后缀的lcp-k+1|lcp>=k)。 首先用一个没有出现过的字符拼接两个串。跑出sa和height.两个后缀的lcp为在它们排名之间的height的最小值。 所以我们可以对于某一个height,求出它作为最小值的一个区间l[i],r[i],然后最后对于所有>=k的heigh原创 2018-01-18 17:35:30 · 291 阅读 · 0 评论 -
poj3261 Milk Patterns
题面在这里题意:在一个串中找出重复出现次数至少为k的最长子串的长度。做法:首先跑出sa。 然后二分答案x,只要找到连续的一段height[i]>=x,如果这段的长度大于等于k-1就可行。 注意是k-1不是k。 因为height计算的是两个相邻排名的后缀的lcp,如果有k个串的最长公共子串都>=x,则只要他们之间的height>=x即可,他们之间只有k-1个height原创 2018-01-18 13:56:32 · 236 阅读 · 0 评论 -
poj3294 Life Forms
题面在这里题意:给你n个串,找出最长的出现在超过n/2个串中的公共子串。做法:首先二分一个长度x,然后问题转化为如何检验是否存在超过n/2个串的公共子串长度为x。 对于公共子串这个问题,马上想到后缀数组,因为height[]数组就可以巧妙地解决这个问题。 首先把所有串用一些不同的没有出现过的字符连接起来。跑这个大串的sa。 把所有后缀按照height分组,把heigh原创 2018-01-18 11:15:26 · 283 阅读 · 0 评论 -
bzoj4319: cerc2008 Suffix reconstruction
题面在这里题意:给出sa[]数组,求原字符串,字符都是’a’~’z’所有小写字母。做法:qaq此题乱入。。。 其实是个贪心,涉及到了一点点的后缀数组。考虑两个后缀suf(p1)" role="presentation" style="position: relative;">suf(p1)suf(p1)suf(p1)和suf(p2)" role="presentati原创 2018-01-25 18:28:17 · 293 阅读 · 0 评论 -
bzoj3172: [Tjoi2013]单词
题面在这里题意:给n个单词,问每个单词在所有单词中出现了多少次。做法:后缀数组。(ac自动机也可以qwq) 首先把所有串用不同的字符拼接起来,跑大串的sa。 然后对于每一个单词,假设它的长度为len,暴力找到h[i]>=len的最左边和最右边的位置l,r,然后这个单词出现的次数就是这一段的长度r-(l-1)+1。 (其实暴力应该是水过的?qaq,正解大概搞个二分什么的就行。。原创 2018-01-25 18:55:39 · 274 阅读 · 0 评论 -
spojPHRASES Relevant Phrases of Annihilation
题面在这里题意:求在每个字符串中都满足不重叠的出现次数>=2的最长子串。做法:拼接+二分答案+height分组。 首先将所有串用一些不同于串中字符的字符连接起来。(这些字符也要不相同)然后跑这个大串的sa。二分一个最长的长度x,按照height分组,height>=x的都是合法的,每连续合法的一段,要判断这一段里是否每个串(原来的)出现>=2次,并且最大的位置和最小的原创 2018-01-23 23:01:35 · 314 阅读 · 0 评论 -
poj2774 Long Long Message
题面在这里题意:求两个长串的最长公共子串。做法:将两个串拼接起来,中间用一个没有出现过的字符连接。 于是两个字符串的最长公共子串就是这个长串两个后缀的lcp,其中这两个后缀的起点分别在两个串里。 所以跑这个长串的SA就可以了。代码:/*************************************************************原创 2018-01-13 17:34:54 · 210 阅读 · 0 评论 -
poj1743 Musical Theme
题面在这里题意:求n个数相邻两数差组成的数列中,两段不重叠的最长相同子串。做法:首先二分一个答案x,然后将SA[]分组,每一个height[i]>=x连续区间的SA[i]都分为一组。 对于每一个连续区间,这个区间任意两个后缀的lcp都>=x,所以我们找到最大和最小的SA[i],看是否能符合条件即可。代码最下面有一个博客链接,讲得挺详细,初学者可以看一看。 另外还有一原创 2018-01-13 16:35:28 · 243 阅读 · 0 评论 -
牛客练习赛10 C-最长回文
题面在这里题意:有两个长度均为n的字符串A和B。可以从A中选一个可以为空的子串A[l1..r1],B中选一个可以为空的子串B[l2..r2],满足r1=l2,然后把它们拼起来(A[l1..r1]+B[l2..r2]) 求这样得到的最长回文串长度。做法:(ps.这题被scx大佬秒了%%%)首先,一个串中找一个最长回文子串可以用SA来做,你把这个串正反拼接一下,然后枚举中原创 2018-01-13 01:15:37 · 538 阅读 · 0 评论