来自具有最大xor的范围的两个值

时间:2015-12-08 12:18:04

标签: algorithm bit-manipulation

我们给出两个约束L和R(L&lt; = R)并且我们必须找到两个值i和j(l <= i <= j <= R),使得它们的Xor是最大的。

我已经尝试过O(n ^ 2)所以想要更好的东西。

2 个答案:

答案 0 :(得分:2)

以下是您可以使用的解决方案(这为您提供了log(R)中的答案)

让我用一个例子解释一下:

L=34R=45。将它们表示为位数组:

L = 100010     R = 101101

从左边开始,直到找到第一个不匹配的形式:

L[i] = 0 and R[i] = 1

你总能找到这个,因为L&lt; R.(如果L == R,这是微不足道的,答案是0

从此处开始,将L的每一位更改为1,将R的每一位更改为0

您获得的数字将是ij,他们的XOR将是您获得的最大数量。

例如。 34和45

  100010 and 101101
1st mismatch at index 2 [0-based] 
From there, change all L[i] to 1 and all R[i] to 0
=> i = 100111 and j = 101000
=> i = 39 and j = 40
and i^j = 15

答案 1 :(得分:1)

如果这是一次性请求,没有预处理:

给定范围[ L R ],您只需要能够在特定位位置找到 1 的数字在这个范围内的数字之间。这可以通过位操作轻松完成。

假设您有 L = 0, R = 7,则二进制数字为:

000, 001, 010, ..., 111

当前数字为000,要最大化 xor ,您需要找到最高位位置 1 的数字。第一个这样的数字是 4 = 100 。现在你正在处理范围100, 101, ..., 111并位于第二高位。位于第二高位置的位是 0 ,因此要最大化xor,您需要在该位置再次使用 1 的数字。第一个这样的数字是 6 = 110 。您可以再次应用相同的模式。现在您完成了000,您可以对001执行相同操作,等等。

一个数字的迭代次数是从 L R 的数字中的最大位数。因此,操作总数为O((R-L+1)*log(R-L+1))