前缀树实现最大异或子数组

问题描述

数组异或和的定义:把数组中所有的数异或起来得到的值。给定一个整型数组arr,其中可能有正、有负,有零,求其中子数组的最大异或和。

输入
4
3 -28 -29 2
输出
7
说明
{-28,-29}这个子数组的异或和为7,是所有子数组中最大的

思路

对于求子数组问题,通常采取动态规划dp[i]=k表示前i项的异或值
那么对于其中的【i=>j】其异或值为dp[j]与dp[i-1]的“异或值做除法"

本题思路是维护一个前缀数组,即字典树形式
计算XOR[]表示前i项的异或值,那么对于以第i项结尾的子数组
其最大的异或值,应当在[1=>i] [2=>i]…等子数组中寻找
通过沿着前缀树,按照贪心的策略:
对于符号位,希望其与当前XOR[i]符号位一致(使得符号位为0 正数)
对于非符号位,希望其与当前XOR[i]的对应位置取反(使得中间位为1)

代码实现

#include<iostream>
#include<vector>
using namespace std;
struct node
{
    node* num[2];
};

node* head;
void a
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值