知识点:Trie
在给定的N个整数A1,A2……ANA1,A2……AN中选出两个进行xor(异或)运算,得到的结果最大是多少?
输入格式
第一行输入一个整数N。
第二行输入N个整数A1A1~ANAN。
输出格式
输出一个整数表示答案。
数据范围
1≤N≤1051≤N≤105,
0≤Ai<2310≤Ai<231
输入样例:
3
1 2 3
输出样例:
3
暴力写法超时
构建串树时间复杂度O(n)
数字的二进制,头部放在串树的头部,保证最大!
import java.io.*;
import java.lang.Integer;
class Main{
static int N = 3000010;//10^5 * 30位
static int[][] t = new int[N][2];
static int idx = 0;
static void insert(int num){//构造串树
int p = 0;
for(int x = 30; x >= 0; --x){
int c = num >> x & 1;
if(t[p][c] == 0)t[p][c] = ++idx;
p = t[p][c];
}
}
static int compare(int num){//比较当前数字的二进制数和串树,当前是0则找串树的1,否则找0,没有相反的情况那就找一样的
int p = 0;
int max = 0;
for(int x = 30; x >= 0; --x){
int c = num >> x & 1;
if(t[p][c == 0 ? 1 : 0] == 0){
max = max << 1;
p = t[p][c];
}else{
max = (max << 1) + 1;
p = t[p][c == 0 ? 1 : 0];
}
}
return max;
}
public static void main(String[] args)throws Exception{
BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter buw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.valueOf(buf.readLine());
String[] params = buf.readLine().split(" ");
for(int i = 0; i < n; ++i){
int num = Integer.valueOf(params[i]);
insert(num);
}
int max = 0;
for(int i = 0; i < n; ++i){
int num = Integer.valueOf(params[i]);
int m = compare(num);
max = Math.max(max, m);
}
buw.write(max + "");
buw.flush();
buf.close();
buw.close();
}
}
432

被折叠的 条评论
为什么被折叠?



