![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
后缀数组
Jinx_jinx_again
啊啊啊啊哈哈哈
展开
-
POJ 2217 Secretary (后缀数组)
题目大意:计算两个字符串的最长的公共字符串字串的长度。思路分析:将两个串合并起来。然后直接跑后缀数组求出height然后就可以直接扫描一次height ,加个是不是在一个串中的判断就可以了。#include #include #include #include #define maxn 200005using namespace std;cha原创 2014-06-29 20:53:38 · 910 阅读 · 0 评论 -
Hdu 4117 GRE Words (后缀数组+dp)
题目大意:求出最多能记住的单词的权值和,要求最大。记住的规则就是上一个单词是这个单词的子串。思路分析:首先得声明这题是数据水了才能用sa做的。sa的复杂度最多可以达到 Orz(sumlen * sumlen) ...所以我们sa处理的就是这个串是否是下一个串的子串,如果是就转移方程。dp[i] = max (dp[i] , dp[j] + val[i])...原创 2014-08-30 23:10:57 · 824 阅读 · 0 评论 -
hdu 4691 Front compression (后缀数组)
题目大意:介绍了一种压缩文本的方式,问压缩前后的文本长度。思路分析:后缀数组跑模板然后考虑两次l r之间的lcp。然后减掉重复的长度。注意ans2的累加。#include #include #include #include #include #define maxn 200005using namespace std;typedef lon原创 2014-08-13 15:43:02 · 869 阅读 · 0 评论 -
hdu 4416 Good Article Good sentence (后缀数组)
题目大意:给出一个A串和很多个B串,求出A中有多少个子串,是所有的B中没有出现的。思路分析:后缀数组的作用很容易的求出来整个串中不同的子串个数。现在要求的是A中不同的,且在B中没有出现过的。先把AB 串全部连接,跑一遍suffix array。然后求出有多少个不同的子串。然后再单独用B 串跑 suffix array。再求出单独在B 中有多少个不同的 子串。原创 2014-08-07 20:46:41 · 719 阅读 · 0 评论 -
hdu 4029 Distinct Sub-matrix (后缀数组)
题目大意:n*m的矩阵中,有多少个子矩阵不是同的。思路分析:假设这题题目只是一维的求一个串中有多少个子串是不同的。那么也就是直接扫描height,然后减去前缀。现在变成二维,如何降低维度。知道hash 的作用就是将一个串映射到一个数字。那我们就将这个矩阵hash,考虑到不同的长度和宽度都会导致不同,所以就要枚举子矩阵的宽度。hash [i][j]原创 2014-08-04 17:03:01 · 819 阅读 · 0 评论 -
SPOJ 694、705 Distinct Substrings 、 New Distinct Substrings (后缀数组)
题目大意:求串中不同的子串的个数。思路分析:子串一定是某一个后缀的前缀。所以我们把每一个后缀拿出来,分析它有多少个前缀,然后除去它与sa数组中前面那个后缀相同的前缀。最后也就是 ans = segma (n-sa[i] + height[i])....#include #include #include #include #define maxn 1原创 2014-07-01 20:49:40 · 694 阅读 · 0 评论 -
POJ 1226 Substrings (后缀数组)
题目大意:问的是m个字符串里,都出现过的子串。子串也可以出现在这个串的逆序串中。思路分析:居然wa在全5个 “a” 的数据上。二分的时候下界不能为0。。思路大致上是把原串和逆序串全部处理出来,放入str中,然后在每个串中间加一个没有出现过的。此处注意输入不仅仅是字母。然后跑一遍后缀数组。然后用标记计数就好了。#include #include原创 2014-07-04 14:22:15 · 614 阅读 · 0 评论 -
POJ 3693 Maximum repetition substring (后缀数组)
题目大意:求出字典序最小,重复次数最多,的子串。思路分析:RMQ + height 数组可以求出任意两个后缀的lcp我们枚举答案字符串的重复的长度。如果这个字符串的长度为 l ,而且这个字符串出现过两次或两次以上那么你会发现在原串中 str[0] str[l] str[2*l] ....肯定有相邻的两个被包含在重复的串中。我们求出这两个相邻的后缀的lcp我原创 2014-07-04 10:52:49 · 669 阅读 · 0 评论 -
POJ 3729 Facer’s string (后缀数组)
题目大意:串1中有多少个后缀和 串2中的某个后缀 的lcp 为 k思路分析:先找出 长度至少为k的对数有多少。再找出 至少为k+1的有多少然后相减。#include #include #include #include #include #include #define maxn 110005using namespace std;int原创 2014-07-02 23:44:22 · 932 阅读 · 0 评论 -
POJ 3294 Life Forms (后缀数组)
题目大意:求出在m个串中出现过大于m/2次的子串。思路分析:如果你只是直接跑一次后缀数组,然后二分答案扫描的话。那么就试一下下面这个数据。2abcdabcdefghefgh这个数据应该输出efgh问题就在于对于每一个串,都只能参与一次计数,所以在check的时候加一个标记数组是正解。#include #include #inc原创 2014-07-02 16:40:07 · 695 阅读 · 0 评论 -
POJ 3261 Milk Patterns(后缀数组)
题目大意:求可覆盖的出现k次的子串的最大长度。思路分析:同样是二分答案的长度,然后扫描height判断是否成立。#include #include #include #include #define maxn 1000005using namespace std;int str[maxn];int sa[maxn],t1[maxn],t2[maxn]原创 2014-07-01 20:15:01 · 622 阅读 · 0 评论 -
POJ 3080 Blue Jeans (后缀数组)
题目大意:求出这些DNA序列中的最长且字典序最小的公共子串。思路分析:二分长度的答案,去height中扫描这个长度是否满足,一旦满足就马上输出,这样就可以保证字典序最小了。#include #include #include #include #define maxn 1005using namespace std;char str[maxn]原创 2014-07-22 10:11:09 · 708 阅读 · 0 评论 -
SPOJ 220 Relevant Phrases of Annihilation (后缀数组)
题目大意:求在m个串中同时出现两次以上且不覆盖的子串的长度。思路分析:二分答案,然后check是否满足,判断不覆盖的方法就是用up down 来处理边界。#include #include #include #include #include #include #define maxn 110005using namespace std;char原创 2014-07-02 19:48:44 · 738 阅读 · 0 评论 -
POJ 1743 Musical Theme (后缀数组)
题目大意:刚才上88个键弹出来的音符。如果出现重复的,或者是高一个音阶的重复的都算。思路分析:具体可以参考训练指南222.height数组表示按照排序后的sa最近的两个后缀的最长前缀。将height 分块。然后二分答案,二分答案之后去判断是否满足。要考虑到不重合,还有大于5。所以二分的时候要从5开始,然后判断的时候要加一个 up - down >le原创 2014-06-29 20:08:11 · 718 阅读 · 0 评论 -
Hdu 5030 Rabbit's String (后缀数组)
题目大意:要求将一个长串分解成最多k个子串,使得分开的n个串的字典序最大的那一个子串的字典序最小。思路分析:要最大的最小,不难想到二分的。我们二分出原串中的第rk大子串就是目标串。现在就是怎么判断这个串满足要求,也就是我们如何分其他部分,使之成为字典序最大的一个。我们可以通过rk轻易的找到这是哪一个串,假设它处在sa[t]中。那么可以知道 在 sa数组中t以前的原创 2014-09-25 16:22:52 · 1327 阅读 · 0 评论