随笔分类 -  acm-后缀数组

poj 1743(后缀数组)
摘要:题意:求一个串中的最长重复不重叠子串。分析:只需要做到不重叠就解决了。代码实现:#include#include#include#includeusing namespace std;int ws1[20005],wv[20005],wa[20005],wb[20005];int rank[20005],height[20005],sa[20005];int str[20005],a[20005],len;int cmp(int *r,int a,int b,int l){ return r[a]==r[b] && r[a+l]==r[b+l];}void da(int *r, 阅读全文

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

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开发工程师 阅读(509) 评论(0) 推荐(0)

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开发工程师 阅读(1149) 评论(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开发工程师 阅读(621) 评论(0) 推荐(0)

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开发工程师 阅读(1180) 评论(0) 推荐(0)

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开发工程师 阅读(885) 评论(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开发工程师 阅读(212) 评论(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开发工程师 阅读(254) 评论(0) 推荐(0)

后缀数组
摘要:后缀数组:从今天起开始新一轮的学习--《后缀数组》。第一步:学习后缀树的建立,好的资料:http://hi.baidu.com/zealot886/item/5d35b442d059701a886d1072。看了大概两个小时,基本的意思看懂了,这是采用了压缩的原理很好的建立了一棵后缀树,知道了它的用途:1、查找一个字符串T是否在字符串S中出现过,如果出现过的话必然是某个后缀的前缀;2、查找一个字符串T在字符串S中出现的次数如果T在S中出现了两次,则S应有两个后缀以T为前缀,重复次数统计出来就行了;3、字符串S中最长重复子串(两次或两次以上),找到最深的非叶节点,为什么要非叶节点呢?因为既然是要 阅读全文

posted @ 2013-06-04 20:48 后端bug开发工程师 阅读(420) 评论(0) 推荐(0)

导航