后缀数组
aozil_yang
这个作者很懒,什么都没留下…
展开
-
POJ 3261 Milk Patterns (后缀数组 + 二分)
题意: 给你一个两万的数组, 求可重叠的K次最长重复子串。 思路: 后缀数组经典问题 类似于求不可重叠的最长重复子串。 先求一遍后缀数组, 给sa数组 分块。 二分长度m 每一块 height 必须大于等于 长度m。 然后如果存在一块, 满足数量大于等于k 那么这个长度m就是合法的。 继续二分即可。 #include #include #include #include原创 2017-04-28 18:07:39 · 317 阅读 · 0 评论 -
POJ 1743 Musical Theme (后缀数组 + 二分)
题意: 给你一个数组,求最长重复不重叠子串, 一段子串 如果每个元素加上或减去某个数 也是相同的。 思路: 虽然每个元素加上或减去某个数也是一样的, 那么这一段相邻的差值是不变的, 那么我们就可以求 差值数组的后缀数组。 这样 就可以直接用后缀数组来做了,论文里的例题。 二分长度k, 然后给sa 数组进行分块。 每一块中height必须都要大于等于k 那么每一块中 的最大sa - 最原创 2017-04-28 17:06:33 · 473 阅读 · 0 评论 -
UVA 11107 Life Forms(后缀数组+二分)
思路: 后缀数组+二分: 我们先把n 个字符串用不同的字符连接起来,注意最后要加上一个字符。 然后求这个字符串的后缀数组。 然后二分答案,判断长度len 是否可行。 判断方法是同样的套路,给sa数组进行分块,每一块都大于等于长度len,然后判断每一块是否有超过一半的串在这一块中出现, 可以开一个flag数组, 记录每一块的字符串, 最后统计flag数组即可。 这样我们二分得到了最长长度l原创 2017-05-03 22:36:27 · 403 阅读 · 0 评论 -
SPOJ - DISUBSTR (后缀数组)
题意: 求一个字符串的不同子串的个数? 思路: 后缀数组算法: 每一个子串都是某一个后缀的前缀,那么问题转换为 求 所有后缀的不同前缀个数。 如果按照后缀数组 sa[0],sa[1],sa[2],,,sa[k]访问的话, 那么访问sa[k] 便会新加入n - sa[k] + 1个 前缀。 这些前缀中 有height[k] 是与前面重复的,减去即可。 #include #inclu原创 2017-04-26 21:39:30 · 416 阅读 · 0 评论 -
POJ 2217 Secretary (后缀数组)
题意: 求最长公共子串。 思路: 后缀数组 直接将两个串S和T用一个未出现的字符'\0'连接起来。 求后缀数组。 当两个sa[i] 属于两个串时,更新lcp[i]最大值即可。 #include #include #include #include #include using namespace std; const int maxn = 10000 + 10; in原创 2017-04-26 22:14:08 · 430 阅读 · 0 评论 -
HDU 6194 string string string (2017沈阳网赛-后缀数组)
题意: 告诉你一个字符串和k , 求这个字符串中有多少不同的子串恰好出现了k 次。 思路: 后缀数组。 我们先考虑至少出现k 次的子串, 所以我们枚举排好序的后缀i (sa[i]) 。 k段k 段的枚举。 假设当前枚举的是 sa[i]~sa[i + k -1] 那么假设这一段的最长公共前缀 是L 的话。 那么就有L 个不同的子串至少出现了k次。 我们要减去至少出现k + 1次的原创 2017-09-11 08:20:00 · 2664 阅读 · 0 评论