后缀数组
文章平均质量分 81
流沙-岁月
这个作者很懒,什么都没留下…
展开
-
poj 1743
题意:给n个数字的序列,输出具有相同变化的最长公共不重叠子串 分析:由于是要求具有相同变化,因此先将序列前后相减,再利用后缀数组的height数组求解就行了。 代码如下: #include #include #include #include #include #include #include #include #include #include #incl原创 2015-08-28 11:27:30 · 390 阅读 · 0 评论 -
poj 3261
给出n个数字的序列,求其中出现了k次的最长可重叠公共子串。典型的后缀数组模板题,直接上代码了。 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #原创 2015-08-28 21:11:21 · 409 阅读 · 0 评论 -
ural 1297
题意:求一个字符串的最长回文子串,有多个相同长度时输出最先出现的那个。 对这道题,刚开始得到的一个提示是在原串后面加一个不可能出现的字符,再把原串反转拼接到后面,接着求由不可能出现字符分开的两部分的最长公共前缀。后来这样试了一下,很明显的就WA了,像abfeba这种数据会输出ab,很明显不行。于是看了题解,才明白。。。。 正确的应该是枚举原串的每个字符,将其作为回文中心,当原创 2015-08-31 12:58:38 · 501 阅读 · 0 评论 -
poj 3693
题意:一个循环串是指能由其中某个子串循环出现若干次得到的字符串。求一个字符串中的循环次数最多的一个循环子串。 分析:假设要求的循环串是由子串s循环得到的,现在枚举s的长度L,则若循环次数是n,一定会覆盖s[0],s[L],s[2*L]......中相邻的n个点。取最左边的两个点s[i*L]和s[i*L+L],求其最长公共前缀lcp(i*L,i*L+L),若为K,则len=K/L+原创 2015-09-02 18:26:22 · 455 阅读 · 0 评论 -
poj 3415
题意:求两个串的长度不小于k的公共子串数量。 分析:首先,将两个串分别称为A串和B串,简单的做法是将B串放到A串后面,当然,中间要加一个用于分隔的字符,找一个比所有字母都大的就行了。接着求后缀数组,而容易知道,lcp(rank[i],rank[j])-k+1代表以i开头的A串后缀和以j开头B串后缀所能贡献的子串数量,这样,只要枚举i,j就能得到答案,但这样是O(n^2)的时间,显然原创 2015-09-05 15:29:23 · 448 阅读 · 0 评论 -
poj 2774
求两个串的最长公共子串,后缀数组水题,直接贴代码了。 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define L原创 2015-09-05 16:26:34 · 366 阅读 · 0 评论 -
后缀数组
1. 概述 后缀数组是一种解决字符串问题的有力工具。相比于后缀树,它更易于实现且占用内存更少。在实际应用中,后缀数组经常用于解决字符串有关的复杂问题。 本文大部分内容摘自参考资料[1][2]。 2. 后缀数组 2.1 几个概念 (1)后缀数组SA 是一个一维数组,它保存1..n 的某个排列SA[1],SA[2],……,SA[n],并且保证Suffix(SA转载 2015-08-28 11:37:51 · 442 阅读 · 0 评论