折半思想

折半思想

将一个问题已暴力的时间复杂度确定一半, 在以较小的时间复杂度搞定另一半, 统计答案

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))\) 干过此题

posted @ 2019-10-25 19:31  Hs-black  阅读(209)  评论(0编辑  收藏  举报