`
k_lb
  • 浏览: 848535 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论
  • kitleer: 据我所知,国内有款ETL调度监控工具TaskCTL,支持ket ...
    kettle调度

后缀数组 亚马逊笔试题最后一道题考了这道题

 
阅读更多

今天下午看完了后缀树的原理2011.10.26 ,这篇文章写得很赞:http://hi.baidu.com/bupt1/blog/item/7391c0246fdb7a1f918f9dca.html

本文转自http://hi.baidu.com/lewutian/blog/item/4d098138d29c34f9b311c725.html

单独把它列出来是因为这个东西真的很神奇~~~

后缀数组经典思想:多串合并+二分答案+最优性--->可行性

例 1 :最长公共前缀
给定一个字符串,询问某两个后缀的最长公共前缀。 // 直接套用,ans=min( height[ i ] )+rmq k<i<=j

例 2 :可重叠最长重复子串
给定一个字符串,求最长重复子串,这两个子串可以重叠。 // ans=max( hegiht[ i ] ) 0<=i<len

例 3 :不可重叠最长重复子串( pku1743 ) AC
给定一个字符串,求最长重复子串,这两个子串不能重叠。 // 二分转化为判定性问题

例 4 :可重叠的 k 次最长重复子串( pku3261 ) AC
给定一个字符串,求至少出现 k 次的最长重复子串,这 k 个子串可以重叠。 // 同上,也是二分

例 5 :不相同的子串的个数( spoj694,spoj705 )
给定一个字符串,求不相同的子串的个数。
[解法]:
对于每一次新加进来的后缀 suffix(sa[k]), 它将产生 n-sa[k]+1 个新的前缀。但是其中有
height[k] 个是和前面的字符串的前缀是相同的。所以 suffix(sa[k]) 将 “ 贡献 ”
出 n-sa[k]+1- height[k] 个不同的子串。累加后便是原问题的答案。这个做法
的时间复杂度为 O(n) 。


例 6 :最长回文子串( ural1297 )
给定一个字符串,求最长回文子串。
[解法]:
将整个字 符串反过来写在原字符串后面,中间用一个特殊的字符隔开。这样就把问题变为 了
求这个新的字符串的某两个后缀的最长公共前缀。
eg:aabebf ----> aabebf&fbebaa

例 7 :连续重复子串 (pku2406) AC
给定一个字符串 L ,已知这个字符串是由某个字符串 S 重复 R 次而得到的,
求 R 的最大值。
[解法]:
做法比较简单,穷举字符串 S 的长度 k ,然后判断是否满足。判断的时候,
先看字符串 L 的长度能否被 k 整除,再看 suffix(1) 和 suffix(k+1) 的最长公共
前缀是否等于 n-k 。
hit:此题更好的是考察KMP的next
int k=len-next[len];
if(len%k==0) fprintf(fout,"%d\n",len/k);
else fprintf(fout,"1\n");

例 8 :重复次数最多的连续重复子串 (spoj687,pku3693) // 还未完成,抽时间好好做,先做SPOJ
给定一个字符串,求重复次数最多的连续重复子串。
[解法]:
先穷举长度 L ,然后求长度为 L 的子串最多能连续出现几次。首先连续出 现
1 次是肯定可以的,所以这里只考虑至少 2 次的情况。假设在原字符串中连续 出
现 2 次,记这个子字符串为 S ,那么 S 肯定包括了字符 r[0], r[L], r[L*2],
r[L*3], …… 中的某相邻的两个。所以只须看字符 r[L*i] 和 r[L*(i+1)] 往前和
往后各能匹配到多远,记这个总长度为 K ,那么这里连续出现了 K/L+1 次。最 后
看最大值是多少。

例 9 :最长公共子串 (pku2774,ural1517) // 发现倍增的O(NlogN) 好慢……2500+ms
给定两个字符串 A 和 B ,求最长公共子串。
连接字符串,O(N)扫描

例 10: 长度不小于 k 的公共子串的个数 (pku3415) // 未解决
给定两个字符串 A 和 B ,求长度不小于 k 的公共子串的个数(可以相同)。
http://hi.baidu.com/zfy0701/blog/item/f2278a0928991dca3bc763a0.html

例 11: 不小于 k 个字符串中的最长子串 (pku3294)
给定 n 个字符串,求出现在不小于 k 个字符串中的最长子串。 // 已经AC,等于没AC,越来越觉得sort慢了……压着时限过的……且写了5K
[解法]:
参见例3:扩展到看k个一样

例 12: 每个字符串至少出现两次且不重叠的最长子串 (spoj220) // 未做,先去学了radix sort再考虑吧,不过SPOJ时空一向很宽……,那次16数独用了100MB……2s
给定 n 个字符串,求在每个字符串中至少出现两次且不重叠的最长子串。
[解法]:
做法和上题大同小异,也是先将 n 个字符串连起来,中间用不相同的且没 有
出现在字符串中的字符隔开,求后缀数组。然后二分答案,再将后缀分组。判 断
的时候,要看是否有一组后缀在每个原来的字符串中至少出现两次,并且在每 个
原来的字符串中,后缀的起始位置的最大值与最小值之差是否不小于当前答案
(判断能否做到不重叠,如果题目中没有不重叠的要求,那么不用做此判断)。
这个做法的时间复杂度为 O(nlogn) 。

例 13: 出现或反转后出现在每个字符串中的最长子串 (PKU1226) // AC 数据极弱,比我的算法弱
给定 n 个字符串,求出现或反转后出现在每个字符串中的最长子串。
[解法]:
连接字符串(正反向),二分答案,判断是否都出现过。

后缀数组题目推荐
1412
后缀数组的题目

Uva11475

题目大意 给定一个字符串在字符串的末尾加最少的字符是的该字符串成为回文串。
[这个题目我已经加到OJ上了 题号是1139 这个题目根本不用后缀数组的 而且后缀数组的效率也是不最高的 ——Sempr补充]

Pku2774 : 求两个字符串的最长公共子串长度。 // AC

Whu1069 求两个字符串的最长公共子串长度。

pku3581 :http://acm.pku.edu.cn/JudgeOnline/problem?id=3581
题目大意:给定一个数组{A1, A2, …, An} 满足A1 > A2, …, An,把该数组分成三段,单独翻转,使得数组的字典序最小。



http://acm.pku.edu.cn/JudgeOnline/problem?id=3623 // AC

题目大意:给定一个字符数组,可以从数组的开头或者结尾取出元素,按取出顺序排成一列,使得他的字典序最小。

http://acm.pku.edu.cn/JudgeOnline/problem?id=1743 // AC 为什么G++挂,C++AC?肯定是我写错了……而且跑得很慢……
题目大意:求最长不重叠差为定值子串的长度

-》最长不重叠重复子串的长度

(1)二分答案

(2)线性扫描

http://acm.pku.edu.cn/JudgeOnline/problem?id=3450 // 未作

题目大意:求多个字符串的最长公共字串。

http://acm.pku.edu.cn/JudgeOnline/problem?id=3080 // AC

题目大意:求多个字符串的最长公共子串(弱)。

用后缀数组比较麻烦,可以枚举答案,用kmp判定。

Waterloo:life forms:http://acm.pku.edu.cn/JudgeOnline/problem?id=3294 // AC 好题

题目大意:超过一半的串的公共最长子串。

http://acm.pku.edu.cn/JudgeOnline/problem?id=3415 // 未作 好题

题目大意:求两个字符串的长度大于k公共字串的个数。

Whu1084http://acm.whu.edu.cn/oak/problem/problem.jsp?problem_id=1084

题目大意:求最长不重叠重复字串的长度和个数。

Toj2171http://acm.tju.edu.cn/toj/showp2171.html

题目大意:统计每子串可分成可分成多少个重复串


http://acm.pku.edu.cn/JudgeOnline/problem?id=2758
题目大意:给定一个串,要求支持两种操作:插入单个字符或者询问从两个位置开始的最大匹配长度。

分享到:
评论

相关推荐

    后缀数组例题,对学习后缀数组有一点帮组

    本文将深入探讨后缀数组及其相关知识点,帮助你更好地理解和运用这一工具。 后缀数组(Suffix Array)的概念源于1990年,由M. Farach首次提出。它的核心思想是将一个给定字符串的所有后缀按字典序排序,形成一个新...

    后缀数组与应用

    后缀数组的核心思想是将字符串的所有后缀按照字典序进行排序,并将排序后的后缀在原字符串中的起始位置存储在一个数组中,这个数组就被称为后缀数组(Suffix Array,简称SA数组)。 后缀数组的强大之处在于,它提供...

    11.罗穗骞《后缀数组——处理字符串的有力工具》.zip

    罗穗骞的《后缀数组——处理字符串的有力工具》详细介绍了这一数据结构及其应用,包含算法源码和解题源码,对于学习者来说是一份宝贵的资源。 首先,后缀数组是一个有序的字符串集合,由输入字符串的所有后缀组成。...

    详细解析后缀数组(RMQ及LCP)

    后缀数组能够提供一种高效的方式来存储和查询字符串的后缀,这使得它成为解决许多字符串问题的有效工具,例如查找模式匹配、最短重复子串、最长公共前后缀等问题。 首先,我们要明确后缀数组的定义。对于一个字符串...

    后缀数组PPT详细解答

    总的来说,这个压缩包提供了关于后缀数组的全方位学习资源,涵盖了理论、算法实现和实例分析,对于学习和理解后缀数组及其应用非常有帮助。无论是对字符串处理感兴趣的学生还是专业的软件工程师,都能从中受益匪浅。

    后缀数组——罗穗骞附件(源码)

    罗穗骞,可能是某位知名的OI教练或专家,提供了关于后缀数组的源码和相关题目,帮助学习者深入理解这一概念。 后缀数组(Suffix Array)是一个排序的字符串所有后缀的数组。例如,对于字符串"banana",它的后缀有...

    后缀数组的倍增法实现

    3. **秩数组Rank**:对于一个长度为n的字符串S及其后缀数组SA,秩数组Rank是一个长度为n的数组,其中Rank[SA[i]] = i,即Rank数组记录了每个后缀在后缀数组中的位置。 4. **高度数组Height**:对于一个长度为n的字符...

    后缀数组1

    尽管后缀数组的某些方面不如后缀树强大,但在空间复杂度和实现简洁性方面,它具有明显的优势,这使得后缀数组在实际应用中具有广泛的应用前景。随着算法研究的不断深入,我们可以预期后缀数组会在更多的领域中找到其...

    后缀数组——处理字符串的有力工具1

    3. **子串计数**:计算特定子串在原字符串中出现的次数,后缀数组能有效解决这类问题。 4. **回文子串**:找到字符串中最长的回文子串,后缀数组结合Manacher's Algorithm等方法可以高效求解。 5. **连续重复子串**...

    2014-许智磊-后缀数组1

    后缀数组是一种在字符串处理中极其重要的数据结构,由许智磊在IOI2004国家集训队论文中介绍。它是一个一维数组,包含字符串的所有后缀按照字典顺序排序后的起始索引。后缀数组的构建是通过特定算法实现的,如O(nlogn...

    后缀数组——罗穗骞ppt版

    后缀数组的实现和应用 后缀数组是处理字符串的有力工具之一,它可以高效地解决许多字符串问题。下面我们将详细介绍后缀数组的实现和应用。 后缀数组的实现 后缀数组是指一个字符串的所有后缀的排序结果。其中,SA...

    后缀数组的构造和应用基础

    后缀数组的构造和应用基础 后缀数组是一种数据结构,用于处理字符串的搜索和匹配问题。它将字符串的所有后缀排序后的结果储存在一个数组中,每个元素 sa[i] 储存的是排名为 i 的后缀的开始位置。后缀数组的构造可以...

    基于压缩后缀数组实现的一个字符串搜索库

    3. `tsubomi_mkary.cc` 和 `tsubomi_mkcsa.cc`:这些文件可能涉及构建CSA的具体算法,如M-K_ary算法,这是一种用于构造压缩后缀数组的高效方法。 4. `tsubomi_basic_searcher.cc` 和 `tsubomi_search.cc`:这里是...

    后缀数组——处理字符串的有力工具.pdf

    例如,给定几个字符串,可以利用后缀数组快速找到它们共有的最长前缀,这对于文本比较和重复子串查找等应用非常有用。 2.2 单个字符串的相关问题 后缀数组对于处理单一字符串中的重复子串问题、子串的数量计算、...

    树状数组 后缀数组 字典树 多串匹配算法及启示

    本篇文章将探讨四个关键概念:树状数组、后缀数组、字典树以及多串匹配算法,这些都属于字符串处理和高效计算的重要工具,并提供一些实际应用的启示。 1. **树状数组(Counting Array / Fenwick Tree)** 树状数组...

    后缀数组资料打包(论文+PPT+笔记)

    1. **定义**:给定一个字符串S,它的后缀数组是一组整数,这组整数代表S的所有后缀在S中的起始位置,按照字典序排序。例如,对于字符串"SUFFIXARRAY",后缀数组可能为[8, 6, 4, 2, 10, 7, 5, 3, 0, 9],其中"SUFFIX...

    后缀数组(Suffix Array)

    后缀数组的构建通常采用一种称为“基数排序”的方法,这是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数进行比较。本例中使用了一种特定的实现方式——DA算法。 ##### 3.1 构建...

    后缀数组 后缀数组.pdf

    首先是多模式串的模式匹配问题,在这个场景下,可以通过后缀数组快速找到所有模式串出现的位置,所给出的算法每次匹配的时间复杂度为O(m+logn),其中m为模式串的长度。其次是求解最长回文子串的问题,在这个问题中,...

Global site tag (gtag.js) - Google Analytics