- 博客(11)
- 资源 (2)
- 收藏
- 关注
原创 后缀数组da+dc3
以前一看到字符串的题目就有些畏惧,感觉无从下手,只会个KMP和AC自动机,很多情况下都是力不从心,所以打算学各种高端的算法,来解决这类问题,后缀数组应该是性价比教高的吧,至少很简单,容易理解,算法实现是另一回事,毕竟ACM比赛是可以带模版的,所以它也就显得简单实用了,下面一起看看这个实用的数据结构吧! 首先给定一些定义: 字符串S,s[ i ]表示第i个字符,s[ i , j
2013-05-29 21:14:47 4710 1
原创 hdu 4303 Hourai Jeweled(树型DP+统计答案)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=4303 题意:给你一颗树,每个节点有权值,每条边有颜色,问所有满足相邻边颜色不同的路径的权值之和 分析:一开始看成求权值最大的路径,所以就是水题了,不过加个统计就得略想一下子,f[ i ]表示i的所有子节点的连到i 路径和,这里有个限制就是i到子节点的颜色与i到父节点的颜色不同,g[ i ]记录相应的边
2013-05-31 09:22:54 2695 1
原创 spoj 220 Relevant Phrases of Annihilation(n个串的最长公共重复2次子串)
地址:http://www.spoj.com/problems/PHRASES/ 题意:给你n个串,求最长的公共重复子串 分析:跟两个串的最长的公共重复子串差不多,也是将所有串合成一个串,构造后缀数组,然后二分子串长度,在满足条件的区间里,求出n的串的下标的上下界的差值大于等于当前长度,所有串都满足说明存在解,否则无解。。。 代码: /** head files*/ #include #
2013-05-30 17:15:13 2555
原创 poj 1743 Musical Theme(最长不重叠重复子串 后缀数组+二分)
题目:http://poj.org/problem?id=1743 题意:给你一个序列,求序列里长度至少为5的最长不重叠重复子串,这里的重复包括每个元素加减相同的值 分析:对于区间加减可以通过将相邻的元素的差组成新的序列,答案就变成求至少长度4的最长不重叠重复子串,并且至少间隔1的距离,然后就可以用后缀数组来做了,然后二分子串的长度L,找到height数组大于等于这个长度L的区间,求区间对应原
2013-05-30 16:12:04 2466
原创 poj 3294 Life Forms(后缀数组+二分)
题目:http://poj.org/problem?id=3294 题意:给你n给字符串,求在一半以上的串里重复出现的最长子串 分析:将所有字符串合成一个串,字符串自己用不同的字符标记间隔,然后构造新字符串的后缀数组,很容易发现,相同子串一定在后缀数组里相邻,只要判断一个区间里的子串里是否包括了超过一半的不同串,我们只要二分子串的长度,就能得到一些区间,height数组大小都大于等于该长度,这
2013-05-30 13:28:14 2294
原创 POJ 3261 Milk Patterns(后缀数组)
题目:http://poj.org/problem?id=3261 题意:给你一个序列,求序列里重复出现至少K次的最长子串 分析:这题如果学过后缀数组的话,那就是模版题了,直接构造一个后缀数组,然后枚举i,询问[ i, i+k-1 ] 的最长公共前缀就行,i表示排在第i位的后缀 代码: /** head files*/ #include #include #include #incl
2013-05-30 10:33:06 2283
原创 vijos 1069 新年趣事之红包(区间DP)
题目:https://vijos.org/p/1069 题意:给你一个凸包,问遍历所有点一遍的最短路径 分析:由于图形是一个凸包,所以肯定是选一个点,然后从两端不断拓展出去,假设已经拓展[i , i+len ]这几个点,且f[ i ][ len ][0]为遍历这些点,且终点为i的最短路,f[ i ] [len] [1]为遍历这些点,且终点为i+len的最短路,那么有
2013-05-18 20:43:56 2428
原创 hdu 4546 优先队列 数列组合和第m小
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4546 题意:给你n个数,问这n个数的组合的和,第m小是多少 分析:很明显的,要给初始序列排序(我写的时候居然忘记排序了,看来下次得把步骤写下来= =),然后发挥想像力,你会发现这其中有一定规律,我们可以假设有这样的元素, struct data { int start, i; }
2013-05-18 09:23:03 3117 6
原创 Manacher算法——求最长回文子串
Manacher算法是用来求解一个给定字符串的最长回文子串,回文就是将字符串翻转后,与原来一样。这个算法通过添加字符,巧妙的将回文长度为偶数的情况转化成奇数,简化了问题的步骤,并且利用回文的性质,将去除了冗余的比较,从而将复查度降到O(len),能够求出以每个字符为中心的最长回文,从而求出最长的回文子串。 现在,简述一下算法的过程: 在相邻的两个字符之间(包括首尾)添加特殊字符(也就是
2013-05-16 15:50:53 2158
原创 vijos 1014 旅行商简化版(多路DP)
地址:https://vijos.org/p/1014 题意:旅行商问题,不过要求只能单向走,就是有n个地方,要求从西往东,到最东面的地方,在从东往西返回,经过每个点一次,求最短路径 分析:由于有了方向的限制,这题不再是NP难题,我们可以假设有两个人一起从西往东走,走过的点不能重复,这样就有f[ i ][ j ]表示第一个人走到i,第二个人走到j 的最短路径,要求i 最后,预处理f[ 0 ]
2013-05-07 10:17:08 2416
原创 vijos 1002 过河(一类压缩长度的DP)
地址:https://vijos.org/p/1002 题意:一条直线上有m个点,青蛙一次能跳的长度为s~t,每个点的坐标范围1~10^9,1 分析:这题一下子就能想到简单的DP,f[ i ] =min{ f[ j +k ] }+w (s<=k<=t, w为i坐标是否有石子),这样的复杂度是O(L*t)的,主要时间都在L上,由于石头数m比较少,我们应该会发现,实际上有许多石头相隔很远,这之间
2013-05-06 14:42:50 1541
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人