0
点赞
收藏
分享

微信扫一扫

maximum xor subarray以及xor + trie专题

7dcac6528821 2022-01-25 阅读 55

题目:

Given an array of integers. find the maximum XOR subarray value in given array. Expected time complexity O(n).

这里有几个要点:

1. 就像dp基础的preSum, 我们可以有preXOR.

    sum(i, j) = preSum[j] - preSum[i - 1],

=> XOR(i, j) = preXOR[j] ^ preXOR[i - 1] (因为number ^ number = 0; number ^ 0 = number. 之前的数字xor一遍本身都可以消掉了,只剩下(i, j)的数字互相xor)

2. 找最大的xor值,相当于我们有一个数a,还有其他一堆数,在这一堆数里面找和a xor后最大的值。

那么两个数xor,我们知道:

        (1)同一位置两个数的bit值越不一样,xor之后结果越大,即1,所以最好的情况是所有数位取反。

        (2)如果所有数位取反这种数字不存在,那我们优先越高的数位取反,得到的结果里越高位的bit为1,总数字越大

3. 那么不如我们把手上现有的一堆数,放进一个trie里。每个数字都是一个32位的bit,那么都可以是一个32层的trieNode。从trie的root开始,有0有1分两支,一路走下来,是从最高位一路到最低位的bit值。存在就沿着走,需要就建node,不然留nullptr。

比如0010(32位太长,这里就4位吧),0101,1011,0100就可以建成

root - 0 - 0 - 1 - 0 √  0010

             \ 1 - 0 - 0 √  0100

                       \ 1 √  0101

       \ 1 - 0 - 1 - 1 √  1011

那么对于一个数字,我们从最高位开始,从存在的节点里,取尽可能跟该位bit相反bit的节点,一路走到底。得到的数和原来的数xor起来就是最大的了。

举报

相关推荐

0 条评论