LC 2939. 最大异或乘积

https://leetcode.cn/problems/maximum-xor-product/description/

我感觉这题目有个关键点,就是其实我们可以考虑每个bit的影响,不需要过多考虑上下文。

如果是a, b在某一个bit上相同,那么非常好解决。问题在于不同的地方,比如Ai=0, Bi=1这样的情况

对于 `B(i-1..0)` 以及 `A(i-1..0)` 这些都是将来要选择的元素,可以独立进行选择。

但是 `B(n..i+1)` 以及 `A(n..i+1)` 已经是之前进行选择的,

我的解释稍微有点按照直觉表达,形式证明上有点不太行。

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