![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
------后缀数组
fisty
hi
展开
-
POJ 1743 Musical Theme (后缀数组)
思路:先二分答案,判断是否存在两个长度为k的子串是相同的,且不重叠。之后把排好序的后缀按照后缀之间的height值都不小于k分为若干组。例如当字符串为“aabaaaab”时,k = 2,后缀分成了如下4组:可以看出,有希望成为最小公共前缀不小于k的两个后缀一定在同一组。然后对于每组后缀,只需判断每个后缀的sa值的最大值和最小值之差是否大于等于k。如果有一组满足则存在。/********原创 2015-08-30 16:18:16 · 1227 阅读 · 0 评论 -
POJ 3261 Milk Patterns (后缀数组)
题意:求可重叠k次的最长重复子串.思路:和这题类似,http://blog.csdn.net/u013008291/article/details/48105673先二分答案,判断是否有长度为s的可重叠k次的重复子串,之后将后缀分成若干组。要判断有没有一组的后缀个数大与等于k,有则抬高二分答案的上界。/******************************************原创 2015-08-30 16:24:42 · 1216 阅读 · 0 评论 -
SPOJ DISUBSTR Distinct Substrings (后缀数组)
题意:给定一个字符串,求不相同的子串个数.每一个子串一定是某个后缀的前缀。对于一个字符串的后缀,一共可以产生n - sa[i] + 1个子串。但是其中有height[i]个和前面是相同的.所以对于每一个后缀S[sa[i]].贡献的子串个数是n - sa[i] + 1 - height[i];累加后便是答案./*****************************************原创 2015-08-30 16:39:17 · 1129 阅读 · 0 评论 -
用后缀数组求两个字符串的最长公共子串
对于两个字符串,不好直接运用后缀数组,所以我们可以把两个子串串中间用一个在字符串中不会出现的字符连接起 来,比如'$‘,计算后缀数组,检查后缀数组中所有相邻后缀。分属于两个字符串的后缀的lcp的最大值就是答案。因为字符串的任何一个子串都是这个字符串某个后缀的前缀。求A和B 的最长公共子串等价于求A得后缀和B的后缀的最长公共前缀。/******************************原创 2015-08-30 17:28:33 · 3097 阅读 · 1 评论 -
poj 3581 Sequence(后缀数组)
思路:对于第一段序列,因为第一个数最大所以最小的序列等于反串之后的字典序最小子串。用后缀数组可求。之后在剩下的子串中,想分割出两个子串使得反转之后字典序最小,可以这样考虑:先把剩下的字符串进行反转复制两次,样例中去掉第一段序列后剩下的子串为{2, 3, 4},处理完为:{4, 3 , 2, 4 ,3, 2},可以发现{2, 4, 3}这个子串符合题目要求,而且{2}和{4. 3} 正好原创 2015-08-22 23:28:07 · 1144 阅读 · 0 评论