异或
相同得零, 相异得一
暴力代码
int res=0;
for(int i=0;i<n;i++)
for(int i=0;i<n;i++)
res=max(res, a[i]^a[j]);
trie树优化
枚举$A_i$ , 从$A_1$, $A_2$, … , $A_n$ 选出$A_j$ , 使得$A_i xor A_j$ 最大
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1e5 + 10, M = 3e6 + 10;//M=31*N
int a[N], son[M][2], idx;
void insert(int x) {
int p = 0;
for (int i = 30; i >= 0; i--) {
int s = x >> i & 1;
if (!son[p][s]) son[p][s] = ++idx;
p = son[p][s];
}
}
int query(int x) {
int p = 0;
int res = 0;
for (int i = 30; i >= 0; i--) {
int s = x >> i & 1;
if (son[p][!s]) {
res += 1 << i;
p = son[p][!s];
} else p = son[p][s];
}
return res;
}
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
insert(a[i]);
}
int res = 0;
for (int i = 0; i < n; i++) {
res = max(res, query(a[i]));
}
cout << res;
return 0;
}
图画的神似两个人扭腰
你貌似搞错了,,,啥是相同得零,相同得一。。。。。。。。相同究竟得零还是一呢 ???
/斜眼笑
相异得一, 哈哈,谢谢提醒