随笔分类 -  字符串相关(kmp,sa)

对字符串排序
摘要:#include<set>#include<map>#include<stack>#include<queue>#include<cmath>#include<bitset>#include<string>#include<climits>#include<cstdio>#include<vector>#include<utility>#include<cstdlib>#include<cstring>#include<iostrea 阅读全文

posted @ 2012-07-11 21:11 aigoruan 阅读(206) 评论(0) 推荐(0)

poj 3623 Best Cow Line, Gold
摘要:http://poj.org/problem?id=3623题意:给一个字符序列,要求不断的从原序列的首或尾取一个字符,重新生成一个字符序列使得字典序最小。思路:一开始以为直接贪心,比较首尾的字符大小就可以了,深入想就知道,当首尾一样的时候,要依靠后一位作判断。因此问题就转成两个字符串的大小比较(首为顺序,尾为反序)。这样先把原字符串反序放到原字符串的后面,对整个串进行后缀排序,最后就可以rank数组贪心答案。View Code #include<set>#include<map>#include<stack>#include<queue>#in 阅读全文

posted @ 2012-07-09 20:47 aigoruan 阅读(250) 评论(0) 推荐(0)

poj 3261 Milk Patterns
摘要:http://poj.org/problem?id=3261题意:求一个整数序列最长的重复k次的序列,序列可以重叠。思路:后缀数组+二分:得到height数组后,二分答案ans,检查height数据里是否有连续的k-1个值不小于ans。View Code #include<set>#include<map>#include<stack>#include<queue>#include<cmath>#include<bitset>#include<string>#include<climits>#inc 阅读全文

posted @ 2012-07-09 19:08 aigoruan 阅读(123) 评论(0) 推荐(0)

poj 3581 Sequence
摘要:http://poj.org/problem?id=3581题意:给一个整数序列,要求划分成三个连续的子序列,同时将子序列反序,使得最后得到的序列的子典序最小。思路:对于这个序列,很明显,每个整数最后都要反序一次,所以可以先把原来的序列反序,这样问题就可以转化成在一个序列里,划分三个连续的子序列,按一定的顺序输出这个子序列,使得最后的序列字典序最小。先考虑第一个序列,因为原序列的第一个整数是最大的,也就是反序列中最后一个元素是最大的,所以第一个序列就是反序列后的最小后缀。求第二个序列的时候因为没有了第一个序列的最大元素,所以不能直接求最小后缀。这时可以先把第一个序列割出来,然后重复一次剩下的序 阅读全文

posted @ 2012-07-09 11:05 aigoruan 阅读(236) 评论(0) 推荐(0)

最长回文 hdu 3068 poj 3974 ural 1297
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=3068http://poj.org/problem?id=3974http://acm.timus.ru/problem.aspx?space=1&num=1297题意:给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.思路:1、Manacher解法,再每个字母前后面插入字符'#',再找最长回文串。2、拓展KMP解法3、后缀数组解法(超时了)4、二分+暴力(水过)解法4:(三个题目都可以这样解)明显,如果回文的长度是L,那么答案一定不小于L,因而能够 阅读全文

posted @ 2012-07-08 10:01 aigoruan 阅读(517) 评论(0) 推荐(0)

hdu 1867 A + B for you again
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1867题意:给你两个字符串,求输出两个字符串合并的最小字符串;如果第一个字符串的末尾几个字符和第2个字符串的前面几个字符相同即可输出一遍即可,例如:asdf df ->asdf;asdf sd->asdfsd; asdf sdc->asdfsdc;规则:1.长度越短优先 2.字典序越小优先思路:正解是kmp,百度吧~~~ 我的思路是从大到小枚举第一个串的一个长度L,先检查第一个串的L字符值总和N与第二个串的字符总和M是否相等(长度都是L),如果相等则进行匹配,如果匹配成功就是答案了。有点贪心 阅读全文

posted @ 2012-07-07 21:27 aigoruan 阅读(158) 评论(0) 推荐(0)

ACM的第六乐章--后缀数组
摘要:以下题目属于入门级别hdu 1403 ural 1517 简单后缀数组应用http://acm.hdu.edu.cn/showproblem.php?pid=1403http://acm.timus.ru/problem.aspx?space=1&num=1517http://poj.org/problem?id=2774题意:给两串字符,求最长的公共子串。思路:把两个串合成一个串,之间用‘#’隔开,然后对后缀排序,求出height数组值后,当height[k]为两个串的公共前缀长度时,取最大的。hdu 3518http://acm.hdu.edu.cn/showproblem.php 阅读全文

posted @ 2012-06-21 10:01 aigoruan 阅读(460) 评论(0) 推荐(0)

hdu 1711 Number Sequence
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1711题意:给两个数字序列,判断第一个是否包含了第二个数列。思路一(正解):直接kmp;思路二(YY):求出第一个序列的前缀和,在第一个序列中取和第二个序列等长的子序列,如果这个子序列的和与第二个序列的和一样,才进行匹配算法。这个算法可以过不了一些特殊的数据。但在很短的时间内过了。View Code #include<stdio.h>#include<string.h>long long as[1000005],bs[10005],cs[1000005];int check(long 阅读全文

posted @ 2012-06-07 15:49 aigoruan 阅读(194) 评论(0) 推荐(0)

xmu 1337 后缀数组 + 暴力匹配
摘要:http://acm.xmu.edu.cn/JudgeOnline/problem.php?id=1337题意:在一个串中求出一个长度为n的、重复了m次的子串(不能重叠)。思路:一直以为正解是后缀数组加其它高效的搜索方法。一水才知道,就是纯后缀数组+暴力匹配。先用后缀数组求出 sa,height两个数组的值,当height[i]=n时,取出当前子串,进行暴力匹配。囧~~~View Code #include<stdio.h>#include<string.h>#include<stdlib.h>const int maxn = 101000;int wn[m 阅读全文

posted @ 2012-06-07 13:44 aigoruan 阅读(247) 评论(0) 推荐(0)

导航