后缀数组
后缀数组
七九河开
这个作者很懒,什么都没留下…
展开
-
后缀数组模板
typedef long long ll;const int maxn = 200010;int cntA[maxn],cntB[maxn],sa[maxn],tsa[maxn],A[maxn],B[maxn],height[maxn];int Rank[maxn];ll n;char ch[maxn];void solve(){ for(int i = 0;i < ...原创 2019-02-16 10:07:11 · 159 阅读 · 0 评论 -
Musical Theme POJ - 1743 (后缀数组求不可重叠最长重复子串)
题目 https://cn.vjudge.net/problem/POJ-1743 题意给定一个字符串,求最长重复子串,这两个子串不能重叠。思路这题比上一题稍复杂一点。先二分答案,把题目变成判定性问题:判断是否存在两个长度为 k 的子串是相同的,且不重叠。解决这个问题的关键还是利用height 数组。把排序后的后缀分成若干组,其中每组的后缀之间的 height 值都不小于 k。例...原创 2019-02-17 09:58:49 · 202 阅读 · 0 评论 -
Milk Patterns POJ - 3261 (后缀数组求可重叠的最长重复子串)
题目 https://cn.vjudge.net/problem/POJ-3261题意: 求可重叠的最长重复子串,但有一个限制条件。。要至少重复k次思路只需要求 height 数组里的最大值即可。首先求最长重复子串,等价于求两个后缀的最长公共前缀的最大值。因为任意两个后缀的最长公共前缀都是 height 数组里某一段的最小值,那么这个值一定不大于 height 数组里的最大...原创 2019-02-17 10:03:04 · 249 阅读 · 0 评论 -
Power Strings POJ - 2406 (KMP求最小循环节)
题目 https://cn.vjudge.net/problem/POJ-2406题意用next数组求出整个数组的最大前缀,如果整个串是用循环节组成的,那么 n - next[n] 也就是最小循环节,验证最小循环节会被n整出。思路利用KMP算法,求字符串的特征向量next,若len可以被len - next[len]整除,则最大循环次数n为len/(len - next[len])...原创 2019-02-17 10:05:36 · 204 阅读 · 0 评论 -
Long Long Message POJ - 2774 (后缀数组求最长公共子串)
题目 https://cn.vjudge.net/problem/POJ-2774题意给你两串字符,要你找出在这两串字符中都出现过的最长子串思路先用个分隔符将两个字符串连接起来,再用后缀数组求出height数组的值,找出一个height值最大并且i与i-1的sa值分别在两串字符中就好了#include<iostream>#include<cstring&g...原创 2019-02-17 10:11:17 · 267 阅读 · 0 评论