子数组的最大异或和
链接
数组异或和的定义:把数组中所有的数异或起来得到的值。给定一个整型数组arr,其中可能有正、有负,有零,求其中子数组的最大异或和
从高位向低位选择
import java.util.Scanner;
public class Main {
private static int solve(int[] data) {
if (data == null || data.length == 0) {
return 0;
}
Trie trie = new Trie();
trie.add(0);
int sum = 0;
int ret = data[0];
for (int i = 0; i < data.length; ++i) {
sum ^= data[i];
ret = Math.max(ret, trie.query(sum));
trie.add(sum);
}
return ret;
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNext()) {
int n = in.nextInt();
int[] arr = new int[n];
for (int i = 0; i < n; ++i) {
arr[i] = in.nextInt();
}
System.out.println(solve(arr));
}
}
}
class Trie {
private Node root;
class Node {
Node[] children = new Node[2];
}
public Trie() {
this.root = new Node();
}
public void add(int n) {
Node cur = this.root;
for (int i = 31; i >= 0; --i) {
int digit = (n >> i) & 1;
if (cur.children[digit] == null) {
cur.children[digit] = new Node();
}
cur = cur.children[digit];
}
}
public int query(int n) {
Node cur = this.root;
int ret = 0;
for (int i = 31; i >= 0; --i) {
int digit = (n >> i) & 1;
int best = i == 31 ? digit : digit ^ 1;
if (cur.children[best] == null) {
best ^= 1;
}
ret |= ((best ^ digit) << i);
cur = cur.children[best];
}
return ret;
}
}
心之所向,素履以往 生如逆旅,一苇以航