java对ac_AcWing 143. 【Java】最大异或对

// 弹幕一个有意思的解释,异或: 二进制不进位加法

import java.util.*;

public class Main{

class Tire{

int[][] bin;

int idx;

public Tire(int n){

bin = new int[n][2];

idx = 0;

}

public void set(int x){

int p = 0;

for (int i = 30 ;i >= 0 ; i--){

// int cur = x & (1 << i); // 当时想移到高位,但是这样的话结果大概率不是0 or 1

int cur = (x >> i) & 1;

if (bin[p][cur] == 0) bin[p][cur] = ++idx;

p = bin[p][cur];

}

}

public int getMatch(int x){

int p = 0, res = 0;

for (int i =30 ; i >= 0 ; i--){

// int now = x & (1 << i);

// if (bin[p][now^1] != 0) now ^= 1;

// res |= now; // 直接| 是可以的,但是取now写错了。。。

// p = bin[p][now];

int cur = (x >> i ) & 1;

if (bin[p][cur^1] != 0){

res |= (1 << i);

cur ^= 1;

}

p = bin[p][cur];

}

return res;

}

}

void run(){

int n = jin.nextInt();

List list = new ArrayList<>();

for (int i = 0 ; i < n ; i++) list.add(jin.nextInt());

System.out.println(solve(list));

}

int solve(List list){

Tire tire = new Tire(3000000);

for (int i = 0 ; i < list.size(); i++) tire.set(list.get(i)) ;

int res = -1;

for(int i = 0 ; i < list.size(); i++){

int y = list.get(i);

// res = Math.max(res, y ^ tire.getMatch(y));

res = Math.max(res, tire.getMatch(y)); // 其实getMatch 直接求出最大的异或了,因为找每位^1就是最大异或

}

return res;

}

private Scanner jin = new Scanner(System.in);

public static void main(String[] args) throws Exception {new Main().run();}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值