我们给出两个约束L和R(L&lt; = R)并且我们必须找到两个值i和j(l <= i <= j <= R),使得它们的Xor是最大的。
我已经尝试过O(n ^ 2)所以想要更好的东西。
答案 0 :(得分:2)
以下是您可以使用的解决方案(这为您提供了log(R)中的答案)
让我用一个例子解释一下:
让L=34
,R=45
。将它们表示为位数组:
L = 100010 R = 101101
从左边开始,直到找到第一个不匹配的形式:
L[i] = 0 and R[i] = 1
你总能找到这个,因为L&lt; R.(如果L == R,这是微不足道的,答案是0
)
从此处开始,将L
的每一位更改为1
,将R
的每一位更改为0
。
您获得的数字将是i
和j
,他们的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))