后缀数组
文章平均质量分 75
BraketBN
这个作者很懒,什么都没留下…
展开
-
【POJ2774】Long Long Message【后缀数组】
似乎也是例题?找两个字符串的最长公共子串。用间隔符把两个字符串拼起来,然后在height数组里挑相邻两个后缀不在同一个字符串的最大值即可。(为什么要把cnt开到15w才不RE)#include #include #include #include using namespace std;const int maxn = 200005, maxm = 1原创 2016-02-10 10:16:13 · 409 阅读 · 0 评论 -
【BZOJ3654】图样图森破【最长路】【后缀数组】【ST表】【回文串】【LCP】
【题目链接】有一个结论:如果答案不是Infinity,那么最长回文子串只可能出现在一个串里,或者两个串拼接一次形成的串里。那么我们枚举每个串的每个回文中心,对于剩下的不在回文串里的子串,去其他串里找一个拼接串,看能不能形成更大的回文串。于是我们需要一个快速查询LCP的数据结构,选择后缀数组+ST表就可以了。但是这样做复杂度还是比较高,于是我们考虑用图论模型优化。先把单个串是回文原创 2016-05-03 11:55:41 · 1611 阅读 · 1 评论 -
【POJ3693】Maximum repetition substring【后缀数组】【ST表】
一看题解发现竟然是枚举...枚举最多重复子串的长度L,那么这个子串一定会覆盖s[0],s[L],s[2L],...其中相邻的两个点,然后枚举这两个点,求出这两个后缀的LCP,假设该LCP的长度为M,那么循环次数就是M / L + 1。如果不理解可以看下图:此时L = 3,M = 3,L / M + 1 = 2,重复了2次。但是答案的子串并不一定恰好在枚举的两个点原创 2016-02-13 20:37:03 · 515 阅读 · 0 评论 -
【BZOJ4319】cerc2008 Suffix reconstruction【构造】【后缀数组】
【题目链接】将排序好的后缀列出来,每次比较相邻后缀的第二个字符开始的后缀的rank,如果排在前面的后缀的第二个字符开始的后缀的rank比排在后面的大,那么显然后面的后缀的第二个字符就要+1了。/* Telekinetic Forest Guard */#include #include #include using namespace std;const int ma原创 2016-05-11 16:00:52 · 417 阅读 · 0 评论 -
【SPOJ-SARRAY】Suffix Array【后缀数组】
题意:求一个字符串的SA数组。回顾一下模板。出题人说O(n)的才可以得100分,然而倍增也过了。#include #include #include using namespace std;const int maxn = 100005, M = 70;int num[maxn], sa[maxn];int wa[maxn], wb[maxn],原创 2016-02-24 22:52:50 · 445 阅读 · 0 评论 -
【SPOJ-SUBST1】New Distinct Substrings【后缀数组】
和http://blog.csdn.net/braketbn/article/details/50649595一样就是数据规模大了...但是还是照样过。#include #include #include #include using namespace std;typedef long long LL;const int maxn = 50005, M = 30原创 2016-02-15 21:23:46 · 484 阅读 · 0 评论 -
【SPOJ-DISUBSTR】Distinct Substrings【后缀数组】
似乎还是例题?求不同子串的个数。用总的子串减去重复子串,总的子串个数为n * (n + 1) / 2,重复子串个数就是height的和。(cnt又开小了,RE一次)#include #include #include #include using namespace std;const int maxn = 1005, maxm = 1005,原创 2016-02-10 11:02:08 · 784 阅读 · 0 评论 -
【HDU4416】Good Article Good sentence【后缀数组】
研究了一会才搞懂。参照blog(http://blog.csdn.net/acm_cxlove/article/details/7854526 by---cxlove)写的代码。。先把A和所有的B中间用间隔符串起来,然后求sa,rank,height。接下来的大体过程是:求出A与B重复的子串个数 和 A自身重复的子串个数用A的全部子串个数减去上面求出的值原创 2016-02-13 16:44:15 · 754 阅读 · 0 评论 -
【POJ3294】Life Forms【后缀数组】【二分】
首先二分长度x,将不小于x的height分组。然后判断连续的一组内,每个后缀所属的每个字符串的个数是否超过一半即可。二分的时候可以顺便把答案记录下来。注意每次分组完毕后要给vis清零。#include #include #include using namespace std;const int maxn = 110005, maxd = 105, M原创 2016-02-13 20:23:48 · 439 阅读 · 0 评论 -
【POJ3261】Milk Patterns【后缀数组】【二分】
似乎是后缀数组的例题?二分答案ans,将不小于ans的height分组,判断是否有k组即可。听说数字并不是非常大,所以直接把字符集大小设小了。当然也可以离散化。#include #include using namespace std;const int maxn = 20005, maxm = 20005, M = 20000;int num[maxn]原创 2016-02-09 23:59:20 · 1208 阅读 · 0 评论 -
【POJ1743】Musical Theme【后缀数组】【二分】
数据太水,可以把自己程序卡掉。先把数列差分,然后找最长不重叠子串就行了。忘了把差分后数列长度减1,无限WA。#include #include using namespace std;const int maxn = 20005, M = 200;int sa[maxn], rank[maxn], height[maxn];inline int原创 2016-02-10 21:28:13 · 423 阅读 · 0 评论 -
【BZOJ1692】[Usaco2007 Dec]队列变换【后缀数组】【贪心】
【题目链接】很容易发现是贪心,问题在于如果两个字符相等时我们要继续向下比较,这样最坏是O(n^2)的,可以通过BZOJ1640。然后我们就需要一个快速比较字典序的工具了,后缀数组可以。好久没敲,板都快忘了。/* Telekinetic Forest Guard */#include #include #include using namespace std原创 2016-05-16 17:13:34 · 433 阅读 · 0 评论