![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
----------后缀数组
文章平均质量分 90
litmxs
博客内容如有错误,还望指正
展开
-
后缀数组和高度数组 模板及应用
后缀数组原理为了方便处理一些情况, 我们把空串也当做一个后缀, 所以长度为n的字符串有n+1个后缀. sa[i] 表示以S[sa[i]]开头的后缀是字符串所有后缀中字典序第i的. rank[i]表示以S[i]开头的字符串在字符串所有后缀中排第rank[i]位. 用倍增法计算后缀数组. 记rk[i, j]为子串S[i…i+2j2^j-1]在所有长度为2j2^j长度的子串中的字典序排名, 如果i原创 2017-10-07 20:02:29 · 341 阅读 · 0 评论 -
POJ - 1743 Musical Theme 后缀数组 二分
题目链接: POJ-1743 Musical Theme 题目大意一个数组有n个元素, 求最长重复出现(不重叠)的子串的长度, 要求长度大于等于5, 并且如果一个串每个数字加上同一个值等于另一个子串, 视这两个子串相同(1 2 3和4 5 6相同)思路相邻元素作差得到另一个数组, 然后就化简成了求一般的最长重复出现的子串长度了 对新数组求高度数组, 高度数组有一个特性, 其大小变化一定是大->小,原创 2017-10-14 20:43:34 · 207 阅读 · 0 评论 -
POJ - 3261 Milk Patterns 后缀数组 二分
题目链接: POJ - 3261 Milk Patterns题目大意一个数组, 求至少出现k次的最长子串思路求出高度数组, 二分子串长度求解 check时, 对高度数组中每个所有元素的大于等于mid的区间, 统计区间长度如果大于等于k, 就返回true, 如果都小于k, false代码#include <iostream>#include <cstdio>#include <cstring>原创 2017-10-14 20:52:46 · 200 阅读 · 0 评论 -
SPOJ - SUBST1 New Distinct Substrings 后缀数组
题目链接: SPOJ - SUBST1 New Distinct Substrings题目大意一个字符串, 求不重复子串的个数思路先求出所有子串的个数len*(len+1)/2, 在减去重复的个数, 重复的个数可以通过高度数组求出, 对于两个后缀, 如果他们的最长公共前缀=lcp[i], 那么他们贡献了lcp[i]个重复子串, 所以只要高度数组所有的值就好了 注意要用long long不然会溢出代原创 2017-10-14 21:00:08 · 210 阅读 · 0 评论 -
SPOJ - REPEATS 后缀数组
题目链接: SPOJ - REPEATS题目大意求出现次数最多的连续重复子串, 输出出现的次数思路穷举长度len, 如果长度为len的子串出现了两次, 记这个子串所有重复连在为s, 原来的串为r, 那么s肯定包括了r[0], r[len], r[len*2], r[len*3]…中相邻两个, 所以只须看字符r[len*i]和r[len*(i+1)]往前和往后各能匹配到多远,记这个总长度为K,那么这里原创 2017-10-14 21:19:13 · 273 阅读 · 0 评论