摘要: http://www.spoj.com/problems/SUBST1/题意:给定一个字符串,求不相同的子串的个数。解题思路:对于一个后缀sa[k],它产生了n-sa[k]个前缀,减去height[k]个相同的前缀(与前一个比较),则产生了n-sa[k]-height[k]个子串。累加后即结果。View Code 1 /* 2 *Author: Zhaofa Fang 3 *Created time: 2013-04-21-21.19 4 *Language: C++ 5 */ 6 #include <cstdio> 7 #include <cstdlib> 8 ... 阅读全文
posted @ 2013-04-21 21:59 發_ 阅读(1122) 评论(0) 推荐(0) 编辑
摘要: 题目可转化为一个经典问题:给定一个字符串,求最长重复子串,这两个子串不能重叠。解题思路:二分答案。这就转化成判定性的问题。对于每一个答案需要判定该答案是否合法。把height数组分成若干组使得每一组的height都不小于答案k,如果有一组的后缀的sa值的最大值和最小值之差大于k(保证了两个子串不能重复),则答案k成立。倍增算法 1 /* 2 *Author: Zhaofa Fang 3 *Created time: 2013-04-18-16.24 4 *Language: C++ 5 */ 6 #include <cstdio> 7 #include... 阅读全文
posted @ 2013-04-19 23:10 發_ 阅读(192) 评论(0) 推荐(0) 编辑
摘要: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1943题意:给出一个由S个不同单词组成的字典和一个长字符串。把这个字符串分解成若干个单词的连接(单词可重复使用),有多少种方法?解题思路:用Trie存入字典,设dp[i]为从字符i开始的字符串的分解方案数,则有dp[i] = sum{dp[i+len(x)] | 单词x为S[i...L]的前缀}。139MS 1 /* 2 *Author: Zhaofa Fang 3 阅读全文
posted @ 2013-04-03 13:15 發_ 阅读(548) 评论(0) 推荐(0) 编辑
摘要: 入门级状态压缩dp题。题意:从方格中取一些数,要求所取位置不相邻(包括对角线相邻),求最大的和。做法:把每行的状态压缩成二进制数,设状态dp[i][p]为第i行取集合p,容易得出dp[i][p] = max{dp[i-1][q] + cnt[i][p]| 集合p,q可以共存},cnt[i][p]为第i行为集合p时所取得数的和。View Code 1 /* 2 *Author: Zhaofa Fang 3 *Created time: 2013-03-31-10.33 4 *Language: C++ 5 */ 6 #include <cstdio> ... 阅读全文
posted @ 2013-03-31 11:57 發_ 阅读(603) 评论(0) 推荐(0) 编辑
摘要: 这两道题如出一辙,只是判断有效状态有一点小差异。每一行的状态只与前面两行的状态有关,每行可以压缩为二进制的集合,设状态dp[i][j][k]为第i行为集合j,第i-1行为集合k,得出状态方程dp[i][j][k] = max{dp[i-1][k][r]+cnt[j] | 状态i,j,k要能够共存}(cnt[j]为j在二进制下的1的个数,即士兵数)。第一维可以压缩为2,即两种状态交替进行。对于每一行可能出现的组合,可以先预处理出每一种有效状态。poj 1185 1 /* 2 *Author: Zhaofa Fang 3 *Created time: 2013-03-30-1... 阅读全文
posted @ 2013-03-30 23:13 發_ 阅读(558) 评论(0) 推荐(0) 编辑
摘要: Problem Description 小小明最近在玩一款游戏,它由n*m大小的矩阵构成,矩阵上会随机产生一些黑色的点,这些点它们可能会连在一起也可能会分开,这些点的个数没有限制,但是每个1*1方格中最多只可能有一个黑点产生。游戏要求玩家以最短的时间用x*y的小矩阵覆盖这个大矩阵,覆盖的要求有以下2点: 1. x*y大小的小矩阵内必须有x*y个黑点。 2. 多个小矩阵可以重叠,但是每个小矩阵放置的位置必须是独一无二的,即不同的小矩阵内的黑点不能完全相同。例如1*2的矩阵可以横着放,也可以竖着放,这两种方法是不同的,即使它们可能共用黑点。 小小明是个粗心的孩子,他尝试了很多遍都无法将所有... 阅读全文
posted @ 2013-03-23 22:37 發_ 阅读(732) 评论(0) 推荐(0) 编辑
摘要: Problem Description 吉哥这几天对队形比较感兴趣。 有一天,有n个人按顺序站在他的面前,他们的身高分别是h[1], h[2] ... h[n],吉哥希望从中挑出一些人,让这些人形成一个新的队形,新的队形若满足以下三点要求,则称之为完美队形: 1、挑出的人保持他们在原队形的相对顺序不变; 2、左右对称,假设有m个人形成新的队形,则第1个人和第m个人身高相同,第2个人和第m-1个人身高相同,依此类推,当然,如果m是奇数,中间那个人可以任意; 3、从左到中间那个人,身高需保证递增,如果用H表示新队形的高度,则H[1] < H[2] < H[3] .... < H[ 阅读全文
posted @ 2013-03-23 12:24 發_ 阅读(754) 评论(0) 推荐(0) 编辑
摘要: 收获了8个hack,本来排名50+,结果C题没有用long long ,错过了一次绝佳的变紫机会...A题:简单题。快速幂水过。View CodeB题:简单题。没看清题目WA了一次。View Code 1 /* 2 Author:Zhaofa Fang 3 Lang:C++ 4 */ 5 #include <cstdio> 6 #include <cstdlib> 7 #include <sstream> 8 #include <iostream> 9 #include <cmath>10 #include <cstring&g 阅读全文
posted @ 2013-03-18 10:55 發_ 阅读(270) 评论(3) 推荐(0) 编辑
摘要: http://acm.timus.ru/problem.aspx?space=1&num=1018题意:有一棵苹果树,苹果树的是一棵二叉树,共N个节点,树节点编号为1~N,编号为1的节点为树根,边可理解为树的分枝,每个分支都长着若干个苹果,现在要要求减去若干个分支,保留M个分支,要求这M个分支的苹果数量最多。树dp跟一般的dp的解决方案一样也是三个步骤:1、确定状态;2、状态转移;3、算法实现。(算法的实现要满足无后效性等基本原则)由于树的结构,使用记忆化搜索比较容易实现。题目分析:设dp[u][q]为由第u个节点往下取q个分支的最优值,则当前节点的dp值来源于其子节点,这里就要有子节 阅读全文
posted @ 2013-03-12 19:38 發_ 阅读(185) 评论(0) 推荐(0) 编辑
摘要: 题意:求能将所有点覆盖的最小体积的圆锥。体积变化为凹形,故可以三分半径r,再枚举各个点找最大的高h。View Code 1 /* 2 Author:Zhaofa Fang 3 Lang:C++ 4 */ 5 #include <cstdio> 6 #include <cstdlib> 7 #include <sstream> 8 #include <iostream> 9 #include <cmath>10 #include <cstring>11 #include <algorithm>12 #includ 阅读全文
posted @ 2013-02-27 12:31 發_ 阅读(169) 评论(0) 推荐(0) 编辑