maximum xor subarray以及xor + trie专题

题目:

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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值