char s[maxn];
int sa[maxn];
int t[maxn], t2[maxn], c[maxn];
int rank[maxn], height[maxn];
int n;
void build_sa(int m)
{
int i, *x = t, *y = t2;
for(i = 0; i < m; i++)
c[i] = 0;
for(i = 0; i < n; ...
分类:
其他好文 时间:
2014-07-22 23:04:34
阅读次数:
293
Codeforces Round #244 (Div. 2)D (后缀自动机)
(标号为0的节点一定是null节点,无论如何都不能拿来用,切记切记,以后不能再错了)
这题用后缀自动机的话,对后缀自动机的很多性质有足够深刻的理解。没想过后缀数组怎么做,因为不高兴敲。。。。
题意:给出两个长度均不超过5000的字符串s1,s2,求这两个串中,都只出现一次的最短公共子串。
解题思路:求的是公共子...
分类:
其他好文 时间:
2014-05-10 09:17:40
阅读次数:
313
题意:给两个字符串,求一个最短的子串。使得这个子串在两个字符串中出现的次数都等于1.出现的定义为:可以重叠的出现。
解法:后缀数组的应用。从小枚举长度。如果一个长度len合法的话:则一定存在这个样的sa[i]排名。sa[i]与s[i+1]的公共前缀长度大于等于len,且sa[i]与[i-1]的公共前缀长度小于len,同时sa[i+1]与[i+2]的公共前缀长度小于len,同时保证sa[i...
分类:
其他好文 时间:
2014-05-04 09:42:00
阅读次数:
275
题目来源:CF 427D Match & Catch
题意:给出2个字符串 求最短的连续的公共字符串 并且该字符串在原串中只出现一次
思路:把2个字符串合并起来求height 后缀数组height的应用
#include
#include
#include
using namespace std;
const int maxn = 100010;
char s[maxn];
int s...
分类:
其他好文 时间:
2014-05-04 09:32:45
阅读次数:
315
这题昨晚做了,刚开始看题的时候没想出好法子,然后就看D题了,一看D题发现是后缀数组,然后就把模板改了点就交了上去……不幸的是……WA了,然后重新看题,果然题目看漏了……不仅要用后缀数组和前缀数组求出公共子缀,还要是求最小的,而且在每个串里都不能重复的,这下就想了会不会了,然后看见大帝C过了,然后就重新回来看C了,看了会终于明天怎么做了。
C题意:给个图,然后每个点都有权值,求最小的花费及方案数;...
分类:
其他好文 时间:
2014-05-03 21:44:35
阅读次数:
260
D. Match & Catch
可以用各种方法做,字符串hash,后缀数组,dp,拓展kmp,字典树。。。
字符串hash(模板)
http://blog.csdn.net/gdujian0119/article/details/6777239
BKDR Hash Function :
// BKDR Hash Function
unsigned int BKDRHash(c...
分类:
其他好文 时间:
2014-05-03 21:20:47
阅读次数:
282
Codeforces Round #244 (Div. 2) 解题报告...
分类:
其他好文 时间:
2014-05-03 21:10:40
阅读次数:
314
题目来源:POJ 3882 Stammering Aliens
题意:给你m一个一个字符串 求至少出现m次的最长字符串 可以在字符串中重叠出现
思路:二分长度l 然后从height数组中找长度大于等于l的前缀
#include
#include
#include
using namespace std;
const int maxn = 40010;
char s[maxn];
in...
分类:
其他好文 时间:
2014-05-01 17:36:34
阅读次数:
334
什么是后缀数组?后缀数组是一种解决字符串问题的有力工具。相比于后缀树,它更易于实现且占用内存更少。在实际应用中,后缀数组经常用于解决字符串有关的复杂问题。先介绍几个后缀数组中的基本定义:子串:字符串S
的子串r[i..j],i≤j,表示r 串中从i 到j 这一段,也就是顺次排列r[i],r[i+1]...
分类:
其他好文 时间:
2014-04-28 15:54:52
阅读次数:
564