后缀数组
Jerry99s
OI -> ACM -> AI
展开
-
UVALive 4513 Stammering Aliens
题意: 给定一个数m,一个字符串s,求s中至少出现m次的最长子串长度,并输出位置最靠后的对应子串的下标;串长度分析: 构造后缀数组; 先二分答案mid,然后检查高度数组(LCP)中是否有连续的mid个数大于m; 有则L=mid,没有则R=mid-1; 复杂度O(n*(logn)^2+nlogn)代码:#include #include #include #inclu原创 2018-01-24 15:03:10 · 236 阅读 · 0 评论 -
POJ2774 Long Long Message
题目: http://poj.org/problem?id=2774 分析: 求最长公共子串 用一个#将两个串连接,构造后缀数组 在高度数组中求满足条件的最大值 条件时:两个子串在不同串中 代码:#include #include #include #include using namespace std;const int Tmax=1e5+5;int n,p,原创 2018-01-24 16:14:59 · 155 阅读 · 0 评论 -
后缀数组
算法: 一个字符串S,长度为n; 有一个数k,k倍增(2的次方,次方++),k=1->2->4...; 后缀数组sa[i]表示:(长度为k的)第i大的子串的起始位置(指针); 数组rank[i]表示以s[i]开头的(长度为k的)后缀在所有排好序的(长度为k的)后缀中是第几小的; 因此,sa与rank是互逆操作; rank表示你排第几 sa表原创 2018-01-19 21:48:37 · 195 阅读 · 0 评论 -
Codevs 3160 最长公共子串
题目: http://codevs.cn/problem/3160/ 分析: 若n在10000以内,可以O(n^2) dp; 即:f[i][j]= f[i-1][j-1] +1 , s[i]==t[j] = 0 , s[i]!=t[j] 这里是最长公共子串,要注意跟子序列区分开, 子序列在s[i] != t[j]时是f[i][j] =原创 2018-01-20 16:28:25 · 241 阅读 · 0 评论 -
HDU3518 Boring counting
题目: http://acm.hdu.edu.cn/showproblem.php?pid=3518 分析: KMP O(n^3)会超时; 用后缀数组解; 在字符串末尾添加一个‘#’,代表无限小字符(ASCII值小于‘a’); 得到height数组后; 枚举子串的长度lenth; 若有一段连续height值>=lenth,记录这段子串的出现位置的最左start1和最右start2;原创 2018-01-25 11:07:38 · 226 阅读 · 0 评论 -
POJ3581 Sequence
题目: http://poj.org/problem?id=3581 题意: 给定一个数列,分成三段,每段分别反转,求能得到的字典序最小的序列是什么,要求每段非空。 分析: 第一段容易求得,就是把原序列反转后,求一遍后缀数组,取字典序最小的并且满足三段非空的那段序列。 第二三段,是把原序列除去第一段后反转,再复制成双倍长度,求后缀数组,取字典序最小且满足此两段非空的序列。 注意:原创 2018-01-20 15:19:41 · 246 阅读 · 0 评论 -
Codeforces 271D. Good Substrings (后缀数组+前缀和)
题目: http://codeforces.com/problemset/problem/271/D题意:给定一个字母串s,给定每个字母是good/bad字母;一个子串如果包含的bad字母数<=k,则为一个good串;求有多少个good串。分析:首先可以用前缀和处理出s[0]~s[i]有多少个bad字母,用sum[i]表示;则可以 O(1) 地查询任意一个串是否是good串;...原创 2019-01-23 18:47:49 · 611 阅读 · 0 评论