c++异或运算符 ^
也称XOR运算符。规则:相同为0,相异为1,0∧0=0,0∧1=1,1∧0=1,1∧1=0
暴力做法
#include <iostream>
using namespace std;
const int N=10e5+10,M=3000000;
//M是节点个数30*10e5
int n;
int son[N][2],idx;
int a[N];
int main(){
cin>>n;
for (int i=0;i<n;i++) cin>>a[i];
int res=0;
for (int i=0;i<n;i++){
for (int j=0;j<n;j++){
res=max(res,a[i]^a[j]);
}
}
cout<<res<<endl;
return 0;
}
Trie树做法
x>>k&1(x右移k位与1)==》x的第k位是0还是1
#include <iostream>
using namespace std;
const int N=10e5+10,M=3000000;
//M是节点个数30*10e5
int n;
int son[M][2],idx;
int a[N];
void insert(int x){
int p=0;
for(int i=30;i>=0;i--){
int &s=son[p][x>>i&1];
if (!s) s=++idx;
p=s;
}
}
int query(int x){
int res = 0, p= 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{
res+=0<<i;
p=son[p][s];
}
}
return res;
}
int main(){
cin>>n;
for (int i=0;i<n;i++)
{
cin>>a[i];
insert(a[i]);//插入Trie树中
}
int res=0;
for (int i=0;i<n;i++)res=max(res,query(a[i]));//query求出与当前值异或最大的值;
cout<<res<<endl;
return 0;
}