摘要: 题目大意:给出N(N不超过100)个字符串, 求出最长的一个字符串, 使它是超过N / 2个字符串的子串.简要分析:显然还是可以用哈希搞, 但是哈希这种办法太落后了, 而且本身并不是个完美的算法, 因为不可能完美哈希. 于是学习了后缀数组.简单说一下后缀数组, 它把长为L的字符串的L个后缀排序了, sa[i]记录排第i名的后缀是哪一个, rank[i]记录i这个后缀的排名, height[i]记录排名为i的后缀与排名为i - 1的后缀的最长公共前缀(LCP). 这些东西的算法在论文里面都有, 详见2009年国家集训队论文集. 一个NB的结论是, 求i和j两个后缀的最长公共前缀, 不妨设rank 阅读全文
posted @ 2012-03-09 22:57 zcwwzdjn 阅读(950) 评论(0) 推荐(0) 编辑
摘要: 题目大意:求两个长度不超过100000的字符串的最长公共子串, 注意是子串而非子序列, 所以是连续的.简要分析:二分答案M, 设两个串分别为A和B, 从左到右枚举一遍A的长为M的子串, 算出哈希值丢到map里面, 再从左到右枚举一遍B的长为M的子串, 算出哈希再到map里面找. O(NlogN).代码实现:View Code 1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 7 阅读全文
posted @ 2012-03-09 22:35 zcwwzdjn 阅读(361) 评论(0) 推荐(0) 编辑
摘要: 题目大意:给N个数, 和一个正整数K, 求出在这串数中出现过至少K次的子串的最大长度, 这里对出现的字串计数时可以重叠.简要分析:二分答案M, 然后从左到右算一遍长为M的子串的哈希值, 丢到map里面进行计数, 时间复杂度O(NlogN).代码实现:View Code 1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 7 typedef unsigned long long ha 阅读全文
posted @ 2012-03-09 22:30 zcwwzdjn 阅读(177) 评论(0) 推荐(0) 编辑
摘要: 题目大意:给出N个数, 相邻两数做差之后, 得到N - 1个数, 求一个最大的M, 使得存在两个长为M的子串完全相同, 且两个字串不能有重叠的部分(其实还要再错开一位).简要分析:记得在USACO中做过这道题. 标准做法当然是后缀数组, 但我用哈希做的.明显答案可以二分, 二分答案M之后, 从左到右维护长为M的子串的哈希值, 并记录某个哈希值最早出现的下标位置, 这个可以用map搞. 于是就完了. 时间复杂度O(NlogN). 哈希值的算法就很多了, 只需满足一个需求, 就是在已有1..M这个子串的哈希的情况下, 能O(1)得到2..M+1的哈希值. 我用的是大质数幂取模法, 因为C语言的un 阅读全文
posted @ 2012-03-09 22:24 zcwwzdjn 阅读(327) 评论(0) 推荐(0) 编辑
摘要: 题目大意:对时钟的时间hh:mm:ss定义一个平面中的点, 它由时针, 分针, 秒针的质量, 长度, 位置决定, 三根指针分别有长度和质量, 质量均匀分布, 则该时钟的这个时间对应三根指针质心的重心. 给一个初始时间和结束时间, 计算这个点的路程.简要分析:模拟题, 每一秒算一下那个奇葩的点就行了啊. 时间复杂度O(T).代码实现:View Code 1 #include <cmath> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <cstring> 5 #include <alg 阅读全文
posted @ 2012-02-25 19:11 zcwwzdjn 阅读(247) 评论(0) 推荐(0) 编辑
摘要: 题目大意:定义f(x)表示, x最多为某个正整数的f(x)次幂.求[l, r]区间内所有数f(x)的和. r不超过2 * 10 ^ 18.简要分析:我做复杂了, 于是这个做法就是:注意到f(x)的值是小于64的, 我们就可以统计出[l, r]区间内的1次方数, 2次方数直至63次方数(并不是严格2次方, 可以包含4次方等). 令p[x]记录x次方数的个数, 现在我们考虑如何求恰为1次方数的数的个数. 很明显可以利用容斥原理, 答案就是p[1] - p[2] - p[3] - p[5] + p[6] - p[7] + p[10] - ..., 每一项的系数恰为该数的莫比乌斯函数(详见wiki). 阅读全文
posted @ 2012-02-25 01:34 zcwwzdjn 阅读(489) 评论(0) 推荐(0) 编辑
摘要: 题目大意:不超过10 ^ 5个数, 一开始设定为相同的正整数, 模拟3种操作:a) 询问一段区间是否连续, 是的话把这一段数减去某个数, 当某个数小于等于0时相当于断开.b) 把一段区间的数增加一个数, 断开的数不再增加.c) 把一段区间的数与某个数取max , 断开的数不参与此过程.简要分析:数据结构题, 分块要好写一些. 假定每个数减到小于0时修改为0. 每一块多维护4个值: 最小值minv, 变化量delta, c操作的标记addto, 还要记录一个offset, 它的含义是指某一块在其他标记存在的情况下, 不超过-offset的块中的数已经断开. 另外注意到b和c两种标记可以这样处理, 阅读全文
posted @ 2012-02-25 01:24 zcwwzdjn 阅读(305) 评论(0) 推荐(0) 编辑
摘要: 题目大意:在一个8 * 8的地图上, 有一些不同颜色的格子, 每次可以把两个格子交换, 可以交换空白格子, 此时在纵列或横排上有连续的超过2个相同颜色的格子, 它们会同时消去, 剩下的格子会下落至空白位置, 再进行消去过程. 问一次操作能否消去所有格子.简要分析:直接模拟, 和NOIP2011的mayan相似, 不过这题更简单. 枚举每个格子O(n ^ 2), 消去过程O(n ^ 2), 于是复杂度大约是O(n ^ 4).代码实现:View Code 阅读全文
posted @ 2012-02-25 01:06 zcwwzdjn 阅读(238) 评论(0) 推荐(0) 编辑
摘要: 题目大意:把x ^ n - 1分解因式, n不超过1001.简要分析:因式分解似乎是很难的问题, 不过这道题有特殊性. 首先每个式子的分解式中比含(x - 1), 剩下n项恰好是x的0至n - 1次幂, 这里能分组提公因式, 分的组数恰好是n的约数,这样就可以继续下去. 所以最后的答案中总能拼凑得到形如x ^ m - 1的因式, 其中m是n的约数, 那么哪个因式是x ^ n - 1所独有的呢? 我们令这个式子为P(n), 那么有P(1) = x - 1P(n) = (x ^ n - 1) / P(m1) / P(m2) / P(m3) / ... / P(mk), 其中m1, m2, m3, 阅读全文
posted @ 2012-02-25 00:59 zcwwzdjn 阅读(366) 评论(0) 推荐(0) 编辑
摘要: 题目大意:有一扇门, 一开始是好的, 一次来了n个人, 每个人有p的概率把门弄坏, 维修门的费用为a,被一个人发现门坏的罚款为b, 求期望最小花费.简要分析:期望DP. 一开始想顺推没想出来, 后来被同学提醒开始想反推, 果然很顺利!用f[i][0]表示第i个人来之前门坏, 到结束时的期望最小花费, f[i][1]则表示门好. 显然f[n][0] = min(a, b), f[n][1] = 0.0, 然后有f[i][0] = min(f[i + 1][0] + b, a + p * f[i + 1][0] + (1.0 - p) * f[i + 1][1])f[i][1] = min(f[i 阅读全文
posted @ 2012-02-25 00:41 zcwwzdjn 阅读(466) 评论(0) 推荐(0) 编辑