传送门 给定 n 个字符串,求出现或反转后出现在每个字符串中的最长子串。 算法分析: 这题不同的地方在于要判断是否在反转后的字符串中出现。其实这并没有加大题目的难度。 只需要先将每个字符串都反过来写一遍,中间用一个互不相同的且没有出现在字符串中的字符隔开, 再将 n 个字符串全部连起来,中间也是用一 ...
分类:
编程语言 时间:
2017-06-13 09:57:41
阅读次数:
216
传送门 给定一个字符串 L,已知这个字符串是由某个字符串 S 重复 R 次而得到的,求 R 的最大值。 1.后缀数组 做法比较简单,穷举字符串 S 的长度 k,然后判断是否满足。判断的时候, 先看字符串 L 的长度能否被 k 整除,再看 suffix(1)和 suffix(k+1)的最长公共 前缀是 ...
分类:
其他好文 时间:
2017-06-12 10:45:09
阅读次数:
371
(无注释版) #include <iostream> #include <cstdio> #include <cstring> #include <cmath> using namespace std; const int MAXN=100001; char s[MAXN]; int sa[MAXN ...
分类:
编程语言 时间:
2017-06-12 10:43:14
阅读次数:
249
Tyvj传送门 luogu传送门 经典题 统计一个字符串中不同子串的个数 一个字符串中的所有子串就是所有后缀的前缀 先求出后缀数组,求出后缀数组中相邻两后缀的 lcp 那么按照后缀数组中的顺序遍历求解 每一个后缀 suffix(sa[i]) 对于答案的贡献为 len - sa[i] - height ...
分类:
编程语言 时间:
2017-06-12 10:38:39
阅读次数:
252
传送门 其实我就是想练练 rmq 本以为学了线段树可以省点事不学 rmq 了 但是后缀数组中用 rmq 貌似很方便 所以还是学了吧,反正也不难 ——代码 1 #include <cstdio> 2 #define N 100001 3 #define min(x, y) ((x) < (y) ? ( ...
分类:
其他好文 时间:
2017-06-11 16:31:55
阅读次数:
115
传送门 求 n 个串的最长公共子串。 和 2 个串的处理方法差不多。 把 n 个串拼接在一起,中间连上一个没有出现过的字符防止匹配过界。 求出 height 数组后二分公共子串长度给后缀数组分组。 然后 check,每一组中是否所有的字符串都包含。 ——代码 1 #include <cstdio> ...
分类:
编程语言 时间:
2017-06-11 11:27:29
阅读次数:
182
传送门 数据小的话贪心就行。 可以把这个串翻转再接到后面,再求后缀数组,求出 rank 数组就很简单了。 ——代码 1 #include <cstdio> 2 #include <iostream> 3 #define N 60001 4 5 int n, len, m = 256, sum; 6 ...
分类:
编程语言 时间:
2017-06-11 10:29:26
阅读次数:
267
传送门 求出现超过1次的不重叠子串的个数 根据论文中的方法。 枚举子串的长度 k。 用 k 给 height 数组分组,每一组求解,看看当前组的位置最靠后的后缀和位置最靠前的后缀所差个数是否大于长度,大于的话 ans++。 分组思想需要认真体会一下。 ——代码 1 #include <cstdio> ...
分类:
编程语言 时间:
2017-06-11 10:28:00
阅读次数:
198
传送门 求两个串的公共子串(注意,这个公共子串是连续的一段) 把两个串连在一起,中间再加上一个原字符串中不存在的字符,避免过度匹配。 求一遍height,再从height中找满足条件的最大值即可。 为什么只需要相邻两字典序的后缀呢?因为字典序相邻公共前缀一定最大。 ——代码 1 #include < ...
分类:
编程语言 时间:
2017-06-10 17:11:27
阅读次数:
127
题目:http://poj.org/problem?id=3261 仍然是后缀数组的典型应用 后缀数组+lcp+二分 做的蛮顺的,1A 可是大部分时间是在调试代码。由于模板的全局变量用混了,而自己又忘了。,,等西安邀请赛还有四省赛结束之后,该冷静反思下尝试拜托模板了 错误 :1、k用错,题目的k和模 ...
分类:
编程语言 时间:
2017-06-10 12:18:14
阅读次数:
179