折半思想
将一个问题已暴力的时间复杂度确定一半, 在以较小的时间复杂度搞定另一半, 统计答案
Promble 1
Mark Douglas 是一名律师。他的客户 Yuri Ball 在一场车祸中不幸去世。为了帮助 Yuri 的亲属拿到他的遗产, Mark 需要得到一个密码。在 Yuri 的笔记本上,有一个长为 的只包含小写字母的字符串, Mark 知道密码恰好是将这个字符串分解为两个长度为 的子序列且它们构成的字符串恰好相反的方案数。我们认为两种分解方法是不同的,当且仅当两个下标集合构成的集合 是不同的,注意 和 我们认为是相同的分解方法。如
cabaacba
的合法分解共有 CabaaAcBA 和 CabAacBA 两种。 Mark 希望你能帮助他计算出密码,事成之后他决定分给你 six million five hundred thousand dollars 并邀请你去柬埔寨度假。
第一行为一个正整数 n。(n <= 18)
第二行为一个长度为 2*n的字符串,仅包含小写字母。
我的做法:
先(O(2^n)) 处理出前一半的字符集{s1, s2}, 那么后一半就是{rev(s2), rev(s1)} (O(n^3)) dp来搞一搞
Promble 2
给出一些修改, 在二元集合(a, b)中插入或删除, 第一元为关键字, 第二元为权值
查询时, 给出一个数x, 求x & a == x 的集合权值之和(x, a <= (2^{16}))
暴力肯定超时
设s[s1][s2] 为 前二进制下前8位数为s1, 后8位满足x2 & s2 == x2的集合权值之和
那么我们可以在(O(nsqrt(n))) 干过此题