
字符串——后缀数组
HARD_UNDERSTAND
Just try
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
POJ 1743 Musical Theme (后缀数组,求最长不重叠重复子串)
后缀数组模板题 照着kuangbin大神的模板敲得~~ /* * POJ 1743 Musical Theme * 有N(1 <= N <=20000)个音符的序列来表示一首乐曲,每个音符都是1..88范围内的整数,现在要找一个重复的主题。 * “主题”是整个音符序列的一个子串,它需要满足如下条件: * 1.长度至少为5个音符 * 2.在乐曲中重复出现(可能经过转调,“转调”原创 2016-09-01 10:06:02 · 531 阅读 · 0 评论 -
spoj 220 每个字符串至少出现两次且不重叠的最长子串 (后缀数组)
题目:http://acm.hust.edu.cn/vjudge/problem/19293 题意: 给定 n 个字符串,求在每个字符串中至少出现两次且不重叠的最长子串。分析: 做法和上题大同小异,也是先将 n 个字符串连起来,中间用不相同的且没有出现在字符串中的字符隔开,求后缀数组。然后二分答案,再将后缀分组。判断的时候,要看是否有一组后缀在每个原来的字符串中至少出现两次,并且在每个原原创 2016-09-02 12:10:56 · 737 阅读 · 0 评论 -
poj 3294 不小于 k 个字符串中的最长子串(后缀数组+二分)
题目:http://poj.org/problem?id=3294 题意: 给定 n 个字符串,求出现在大于一半个字符串中的最长子串。分析: 将 n 个字符串连起来,中间用不相同的且没有出现在字符串中的字符隔开,求后缀数组。然后二分答案,将后缀分成若干组,判断每组的后缀是否出现在不小于 k 个的原串中。这个做法的时间复杂度为 O(nlogn)。#include<cstdio>#inc原创 2016-09-02 10:35:06 · 354 阅读 · 0 评论 -
poj 3415 :长度不小于 k 的公共子串的个数(后缀数组+单调栈)
题目:http://poj.org/problem?id=3415 题意: 给定两个字符串 A 和 B,求长度不小于 k 的公共子串的个数(可以相同)。 样例 1: A=“xx”,B=“xx”,k=1,长度不小于 k 的公共子串的个数是 5。 样例 2: A=“aababaa”,B=“abaabaa”,k=2,长度不小于 k 的公共子串的个数是22。分析: 基本思路是计算 A 的所有后缀原创 2016-09-02 10:29:26 · 588 阅读 · 0 评论 -
poj 2774 最长公共子串(后缀数组)
题目:http://poj.org/problem?id=2774 题意: 给定两个字符串 A 和 B,求最长公共子串。分析: 字符串的任何一个子串都是这个字符串的某个后缀的前缀。求 A 和 B 的最长公共子串等价于求 A 的后缀和 B 的后缀的最长公共前缀的最大值。如果枚举 A和 B 的所有的缀,那么这样做显然效率低下。由于要计算 A 的后缀和 B 的后缀的最长公共前缀,所以先第二个字符串原创 2016-09-01 17:16:20 · 524 阅读 · 0 评论 -
poj 3693 重复次数最多的连续重复子串(后缀数组+RMQ)
题目:http://poj.org/problem?id=3693 题意: 给定一个字符串,求重复次数最多的连续重复子串分析: 在后缀数组神文中也这题的题解。 比较容易理解的部分就是枚举长度为L,然后看长度为L的字符串最多连续出现几次。 既然长度为L的串重复出现,那么str[0],str[l],str[2*l]……中肯定有两个连续的出现在字符串中。那么就枚举连续的两个,然后从原创 2016-09-01 16:40:28 · 443 阅读 · 0 评论 -
poj 2406 连续重复子串(后缀数组DC3/kmp)
题目:http://poj.org/problem?id=2406 题意: 给定一个字符串 L,已知这个字符串是由某个字符串 S 重复 R 次而得到的, 求 R 的最大值。分析: 做法比较简单,穷举字符串 S 的长度 k,然后判断是否满足。判断的时候,先看字符串 L 的长度能否被 k 整除,再看 suffix(1)和 suffix(k+1)的最长公共前缀是否等于 n-k。在询问最长公共前缀的原创 2016-09-01 15:18:06 · 440 阅读 · 0 评论 -
ural1297 求最长回文子串(后缀数组/Manacher算法)
题目:http://acm.hust.edu.cn/vjudge/problem/12406 后缀数组:#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>using namespace std;#define rep(i,s,t) for(int i=(s);i<(t);i++)#define原创 2016-09-01 14:28:00 · 486 阅读 · 0 评论 -
hdu 4622 求区间不同子串数 后缀数组|后缀自动机|字符串hash
题意: 给你一个长度不超过2000只由小写字母组成的字符串。然后q个询问q不超过10000.每个询问询问一个区间[l,r]内有多少不同的子串。后缀数组分析:这题的做法和论文那题的思想是一样的,就是对于[l,r]区间里的后缀,当一个串i加进去对答案的贡献必须减掉它和之前所有串重复的部分。也就是和它lcp最大的那个,所以答案就是: 所有的串-重复的串。(当然这里的串都是[l,r]区间里的)我们用一个原创 2016-09-01 10:59:48 · 474 阅读 · 0 评论 -
spoj694 不相同的子串的个数(后缀数组)
题目:http://acm.hust.edu.cn/vjudge/problem/19282 题意: 给定一个字符串,求不相同的子串的个数。分析: 每个子串一定是某个后缀的前缀,那么原问题等价于求所有后缀之间的不相同的前缀的个数。如果所有的后缀按照 suffix(sa[1]), suffix(sa[2]),suffix(sa[3]), …… ,suffix(sa[n])的顺序计算,不难发原创 2016-09-01 10:51:14 · 369 阅读 · 0 评论 -
poj 3261 / LA 4513 可重叠的 k 次最长重复子串(后缀数组/字符串hash)
poj 3261 题意: 给出n个数,求可重叠的k次最长的重复子串的长度 分析: 后缀数组: 这题的做法和上一题差不多,也是先二分答案,然后将后缀分成若干组。不 同的是,这里要判断的是有没有一个组的后缀个数不小于 k。如果有,那么存在 k 个相同的子串满足条件,否则不存在。这个做法的时间复杂度为 O(nlogn)#include<cstdio>#include<algorithm>原创 2016-09-01 10:44:34 · 366 阅读 · 0 评论 -
poj 1226 出现或反转后出现在每个字符串中的最长子串(后缀数组/kmp)
题目:http://poj.org/problem?id=1226 题意: 给定 n 个字符串,求出现或反转后出现在每个字符串中的最长子串。分析: 这题不同的地方在于要判断是否在反转后的字符串中出现。其实这并没有加大题目的难度。只需要先将每个字符串都反过来写一遍,中间用一个互不相同的且没有出现在字符串中的字符隔开,再将 n 个字符串全部连起来,中间也是用一个互不相同的且没有出现在字符串中原创 2016-09-02 15:03:45 · 326 阅读 · 0 评论