一系列数字的最大xor

时间:2015-06-13 17:44:49

标签: algorithm max dynamic-programming xor

我正在努力解决这个问题Codeforces 276D。最初我使用了一种蛮力方法,对于大输入显然是失败的(它在输入为10000000000 20000000000时开始)。在教程 Fcdkbear (竞赛的turtor)中讨论了一个状态为d[p][fl1][fr1][fl2][fr2]的dp解决方案。

进一步在教程中

我们需要知道,我们可以将哪些位置于第p个位置的数字а的二进制表示中。如果满足以下条件,则可以置0:L的第p位等于0,或L的第p位等于1,变量fl1表示a的当前值严格大于L.同样,如果满足以下条件,我们可以置1:R的第p位等于1,或者R的第p位等于0,变量fr1表示a的当前值严格小于R.同样,我们可以得到哪些比特我们可以放在第p个位置的数字b的二进制表示中。

当L的第i位为0时,这是我的头脑,那么为什么我们可以在第i位置零。如果L和R都在同一个桶中(第二个像第16和第24个那么边界),我们最终会在第4个位置设置0,而如果a = 20,我们可以放置1,因为i-th bit of R is 0 and a > R。我想知道检查一个>有什么用?是或否。
本质上我没有得到

的逻辑
  1. 状态是什么
  2. 我们如何重复
  3. 我知道这可能是一种矫枉过正,但有人可能会以描述性方式解释它,因为编辑太短暂,无法解释任何事情。

    我已经查看了here,但建议的解决方案与编辑中提供的解决方案不同。另外我知道这可以通过二分查找来解决,但我只关心DP解决方案

2 个答案:

答案 0 :(得分:0)

如果我遇到问题:开始比较l和r从左(MSB)到右(LSB)的位。只要这些位相等就没有选择的自由,相同的位必须出现在a和b中。不同的第一位必须是r中的1和l中的0。它们也必须出现在(0)和b(1)中。从这里你可以最大化XOR结果。简单地使用零来表示a。得到+ 1 == b,xor结果为+ b,总是2 ^ n-1。

答案 1 :(得分:0)

我没有遵循上面写的逻辑,但基本的想法是一点一滴地看。

如果L和R在相同的位位置具有不同的值,那么我们已经找到了最大化该位置的xor'd值的候选(0 xor 1 = 1 xor 0 = 1)。另一种需要考虑的情况是R-L的跨度是否大于该位的位置值。如果是这样,那么A和B必须有两个不同的值落在L和R之间,其中该位具有相反的值(以及能够在较低位中生成值的任何组合。)