上一页 1 ··· 7 8 9 10 11 12 13 14 15 ··· 20 下一页

2013年8月15日

spoj 694(后缀数组)

摘要: 题意:求一个字符串的不重复子串的个数。分析:对于下标为i的位置,能够产生的前缀子串个数为len-i(下标从0开始),对于与它字典序相邻的后缀产生的子串是重复的(就是他们的最长公共前缀),所以我们要减去这部分重复的,即:len-i-height[i]。代码实现:#include#include#includeusing namespace std;int ws1[1005],wv[1005],wa[1005],wb[1005];int rank[1005],height[1005],sa[1005];char str[1005];int cmp(int *r,int a,int b,int l) 阅读全文

posted @ 2013-08-15 23:04 后端bug开发工程师 阅读(500) 评论(0) 推荐(0) 编辑

2013年8月11日

hdu 2459 (后缀数组+RMQ)

摘要: 题意:让你求一个串中连续重复次数最多的串(不重叠),如果重复的次数一样多的话就输出字典序小的那一串。分析:有一道比这个简单一些的题spoj 687,假设一个长度为l的子串重复出现两次,那么它必然会包含s[0]、s[l]、s[l*2]...之中的相邻的两个。不难看出,该重复子串必然会包含s[0..l]或s[l..l*2]或s[l*2..l*3]...。所以,我们可以枚举一个i,对于每个i*l的位置,利用后缀数组可以求出s[i*l..(i+1)*l]向后延伸的长度k。k/l+1即i*l..(i+1)*l这一段重复出现的次数。但还有一种情况。考虑以下的字符串:aababababab假设现在l=2,i 阅读全文

posted @ 2013-08-11 18:06 后端bug开发工程师 阅读(1137) 评论(0) 推荐(0) 编辑

hdu 3948(后缀数组+RMQ)

摘要: 题意:求一个串中有多少不同的回文串。分析:这一题的关键是如何去重,我表示我现在还没理解为什么这样去重,先放这里过两天再看!!//不同回文子串数目#include #include #include #include using namespace std;#define N 200010int ws1[N],wv[N],wa[N],wb[N];int rank1[N],height[N],sa[N];char str[N];int a[N],n;int dp[N][25],vis[N];int mmin(int a,int b){ return a>b?b:a;}int cmp(int 阅读全文

posted @ 2013-08-11 08:55 后端bug开发工程师 阅读(609) 评论(0) 推荐(0) 编辑

2013年8月10日

ural 1297(后缀数组+RMQ)

摘要: 题意:就是让你求一个字符串中的最长回文,如果有多个长度相等的最长回文,那就输出第一个最长回文。思路:这是后缀数组的一种常见的应用,首先把原始字符串倒转过来,然后接在原始字符串的后面,中间用一个不可能出现的字符隔开。然后就用到后缀数组的性质了,我们枚举每一个原始字符串中的字符以它为中心(分为奇数和偶数两种情况)进行查找,比如对于下标为i的字符,当回文串为奇数时,我们要求的就是i的后缀与2*n-i的后缀的最长公共前缀了,然后根据height数组的性质就转化成求height[i+1]...height[2*n-i]中的最小值了,这时我们想到了用RMQ求区间最值了,对于不会RMQ的童鞋可以先去学习下, 阅读全文

posted @ 2013-08-10 10:01 后端bug开发工程师 阅读(1163) 评论(0) 推荐(0) 编辑

RMQ(dp)

摘要: 我一开始是不知道有这么个东西,但是由于最近在学习后缀数组,碰到一道题需要用到后缀数组+RMQ解决的所以不得不学习了。原理:用A[1...n]表示一组数,dp[i][j]表示从A[i]到A[i+2^j-1]这个范围内的最大值或者最小值也就是以A[i]为起点连续2^j个数的最大值或者最小值,由于元素个数为2^j个,所以从中间平均分成两部分,每一部分的元素个数刚好为2^(j-1)个。整个区间的最大值一定是左右两部分最大值的较大值,满足动态规划的最优原理。状态转移方程为:dp[i][j]=min(dp[i][j-1],dp[i+2^(j-1)][j-1]);边界条件为:dp[i][0]=a[i];这样 阅读全文

posted @ 2013-08-10 09:43 后端bug开发工程师 阅读(351) 评论(0) 推荐(0) 编辑

2013年8月6日

hdu 3518(后缀数组)

摘要: 题意:容易理解...分析:这是我做的后缀数组第一题,做这个题只需要知道后缀数组中height数组代表的是什么就差不多会做了,height[i]表示排名第i的后缀与排名第i-1的后缀的最长公共前缀,然后我们可以枚举长度为k(1#include#include#includeusing namespace std;int ws1[1005],wv[1005],wa[1005],wb[1005];int rank[1005],height[1005],sa[1005];char str[1005];int cmp(int *r,int a,int b,int l){ return r[a]==... 阅读全文

posted @ 2013-08-06 19:35 后端bug开发工程师 阅读(874) 评论(0) 推荐(0) 编辑

后缀数组题目

摘要: hdu 3518,hdu 4622,hdu 4436,hdu 1403,hdu 4209,hdu 2459,hdu 3948,poj 2774,poj 3080,poj 3261,poj 1743,poj 3415,poj 3294,poj 3693,poj 3450http://hi.baidu.com/longmenwaideyu/item/f28a2e3733333a80f5e4ad73http://wenku.baidu.com/view/4674ca07e87101f69e319537.html 阅读全文

posted @ 2013-08-06 17:33 后端bug开发工程师 阅读(203) 评论(0) 推荐(0) 编辑

后缀数组资料

摘要: http://www.nocow.cn/index.php/%E5%90%8E%E7%BC%80%E6%95%B0%E7%BB%84后缀数组是字符串处理的一个重要工具。它由原字符串的所有后缀的字典排序而得,具有较高的检索效率。基本概念一、字符串的大小比较: 关于字符串的大小比较,是指通常所说的 “ 字典顺序 ” 比较, 也就是对于两个字符串 u 、v ,令 i 从 1 开始顺次比较 u[i] 和 v[i] ,如果u[i]=v[i] 则令 i 加 1 ,否则若 u[i]v[i] 则认为 u>v,比较结束。如果 i>len(u) 或者 i>len(v) 仍比较不出结果,那么若 l 阅读全文

posted @ 2013-08-06 17:24 后端bug开发工程师 阅读(247) 评论(0) 推荐(0) 编辑

2013年8月5日

poj 4052(ac自动机)

摘要: 题意:自己百度吧!! 分析:就是通过它的fail指针来找出它的子串就行了,这题其实不难的。这好像还是金华邀请赛的题哦! 代码实现: 阅读全文

posted @ 2013-08-05 12:55 后端bug开发工程师 阅读(904) 评论(2) 推荐(0) 编辑

hdu 2457(ac自动机+dp)

摘要: 题意:容易理解... 分析:这是一道比较简单的ac自动机+dp的题了,直接上代码。 代码实现: 阅读全文

posted @ 2013-08-05 12:16 后端bug开发工程师 阅读(391) 评论(0) 推荐(0) 编辑

上一页 1 ··· 7 8 9 10 11 12 13 14 15 ··· 20 下一页

导航