LC 2939. 最大异或乘积
https://leetcode.cn/problems/maximum-xor-product/description/
我感觉这题目有个关键点,就是其实我们可以考虑每个bit的影响,不需要过多考虑上下文。
如果是a, b在某一个bit上相同,那么非常好解决。问题在于不同的地方,比如Ai=0, Bi=1这样的情况
- 如果我们将Ai=1, Bi=0的话,那么其实相当于选择的是 `B(n..i+1) 0 B(i-1..0) x (1 << i)`
- 如果我们将Ai=0, Bi=1的话,那么其实相当于选择的是 `A(n..i+1) 0 A(i-1..0) x (1 << i)`
对于 `B(i-1..0)` 以及 `A(i-1..0)` 这些都是将来要选择的元素,可以独立进行选择。
但是 `B(n..i+1)` 以及 `A(n..i+1)` 已经是之前进行选择的,
- 如果其中一个更大的的话,那么我们就应该选择。
- 如果两者相同的话,那么我们就可以任意选择一个。注意这里选择了任意一个之后,A, B前缀就开始出现了差异。
我的解释稍微有点按照直觉表达,形式证明上有点不太行。
class Solution:
def maximumXorProduct(self, a: int, b: int, n: int) -> int:
MOD = 10 ** 9 + 7
pa = a >> n
pb = b >> n
ans = 0
for i in reversed(range(n)):
ca = (a >> i) & 0x1
cb = (b >> i) & 0x1
bit = 0
if ca == cb == 0:
bit = 1
elif ca == cb == 1:
pass
else:
if pa >= pb:
# preserve pa
bit = (1 - cb)
else:
bit = (1 - ca)
# print((pa, pb), ca, cb, bit)
ans = (bit << i) | ans
pa = (pa << 1) | (ca ^ bit)
pb = (pb << 1) | (cb ^ bit)
return ((ans ^ a) * (ans ^ b)) % MOD