题目:
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起来就是最大的了。