最大异或对 tire树
在给定的N个整数A1,A2……AN中选出两个进行xor(异或)运算,得到的结果最大是多少? 输入格式 第一行输入一个整数N。 第二行输入N个整数A1~AN。 输出格式 输出一个整数表示答案。 数据范围 1≤N≤105, 0≤Ai<231 输入样例: 3 1 2 3 输出样例: 3 直接暴力的复杂度是n²肯定是要超时的 ,知道要用字典树那么就把每个数化成二进制保存啦,因为是异或运算,相同为0不同为1 ,所以在每个节点要优先向相反位走,相反位没路了再向相同为走,为了实现最大化要从高位向低位走(wa了好几次!!!) #include<iostream> #include<map> using namespace std; const int maxn=1e5+100; int ed[maxn*32][5],idx=1;//理论上一个数有32位 实际用不到maxn*32 void insert(int x) { int p=1; for(int i=31;i>=0;i--) { int y=x>>i&1;//取出每一位的值(二进制) if(!ed[p][y]) ed[p][y]=++idx; p=ed[p][y]; } } int query(int x) { int p=1,i=31,ans=0; while(i>=0) { int y=x>>i&1; if(ed[p][1-y])