
后缀数组
文章平均质量分 81
Unin88
这个作者很懒,什么都没留下…
展开
-
poj 3261 Milk Patterns
求解单串的最长可重叠子串,二分+离散化+后缀数组原创 2015-02-17 10:49:32 · 377 阅读 · 0 评论 -
poj 1226 Substrings
最长公共子串(后缀数组解法)仅正序poj 2774 long long message将字符串用不同的分隔符连接起来,求后缀数组和height数组即可,具体需要好好理解sa和height数组的含义。正序逆序均可poj 1226 Substrings将字符串用分隔符与自己的逆序连接后,将所有串连接在一起,然后与正序相同的求法。第二种情况的代码#include #in原创 2015-02-18 11:29:29 · 451 阅读 · 0 评论 -
poj 3294 Life Forms
题意输入n个DNA序列,你的任务是求出一个长度最大的字符串,使得超过一半的DNA序列中连续出现。如果有多解,按照字典序从小到大输出所有解。解法这是一道经典的题目,解法有很多。首先用不同的分隔字符把所有输入的字符串连接在一起。求这个新串的后缀数组和height数组,然后二分答案,每次只需要判断是否有一个长度为p的串在超过一半的串中连续出现。方法是把height分为若干段,每当height原创 2015-02-17 12:52:06 · 487 阅读 · 0 评论 -
后缀数组学习
后缀数组简述后缀数组sa是一个一维数组,它是将 S 的 n 个后缀从小到大进行排序之后把排好序的后缀的开头位置顺次放入 SA 中。比如:BANANA的所有后缀是BANANA,ANANA,NANA,ANA,NA,A,按照字典序排列就是A,ANA,ANANA,BANANA,NA,NANA,那么后缀数组就是{5, 3, 1,0,4,2 }。倍增算法首先将单个字符排序,计算出每个字母的名词原创 2015-02-16 11:09:02 · 466 阅读 · 0 评论 -
hdu 3518 Boring counting
重复至少俩次的不重叠子串的个数若在假设重复子串的长度最多为L的限制下有解, 则对于任意一个比L小的限制L'给出一个关于LCP的定理LCP(SA[i], SA[j]) = RMQ(Height[i+1..j]). 由此, 若存在k, 满足Height[k] 段.枚举字串长度h对于每一次的h,利用height数组,找出连续的height大于等于h的里面最左端和最右端得为之l和r。原创 2015-02-16 12:17:26 · 388 阅读 · 0 评论 -
poj 2774 Long Long Message
本题是求解最长公共子串,解法有两种,第一种是二分+ 哈希,第二种是后缀数组。下面介绍后缀数组的解法。将两个字符串用分隔符28连接起来,末尾补0,那么只需要求出这个字符串的后缀数组和height数组,找到起点分别在两个字符串的最大的height值即答案。AC代码:#include #include using namespace std;const int N = 2000原创 2015-02-16 13:27:38 · 448 阅读 · 0 评论 -
poj 1743 Musical Theme
题意:求一个字符串的不可重叠最长重复子串。题解:后缀数组经典题目。要先把串转换一下,根据题目的性质,应该把输入得到的串前后相减得到方便求解的新的串 —— 设其为s ,再求该串 s 中最长的不重叠重复子串。由于不能重叠,导致height 数组的最大值不一定是解,因为相邻两串可能会重叠。 此题用后缀数组也有两种解法, 1 :二分枚举答案, 2 :用栈线性扫描,主要说做法 1原创 2015-02-16 14:49:20 · 370 阅读 · 0 评论