题意:
给你n个整数,让你选择两个数进行Xor操作后值最大为多少?
思路:
建一颗01trie树,从高位到低位,然后从遍历数组,利用01trie树求每一个数与其中某一个一个数Xor的最大值,然后取总的最大值。
取法:
如果该数在该位上是1则尽可能在01trie树该位取0使其Xor为1。
如果该数在该位上是0则尽可能在01trie树该位取1使其Xor为1。
注意:从高位到低位建树。
代码:
#include <bits/stdc++.h> using namespace std; typedef long long ll; int a[33], cnt[3200005][2], ji=1, pa[1000005]; ll ma=-1; void Insert() { int now=0, i=31; while(i>=0) { if(cnt[now][a[i]]==-1) { cnt[now][a[i]]=ji; ji++; } now=cnt[now][a[i]]; i--; } } void fun() { ll now=0, p=0, k=(1LL<<31), i=31; while(i>=0) { if(a[i]==1&&cnt[now][0]!=-1) { p=p+k; now=cnt[now][0]; } else if(a[i]==0&&cnt[now][1]!=-1) { p=p+k; now=cnt[now][1]; } else if(a[i]==1&&cnt[now][1]!=-1) { now=cnt[now][1]; } else { now=cnt[now][0]; } i--; k=k/2; } ma=max(p,ma); } int main() { int n; scanf("%d",&n); memset(cnt,-1,sizeof(cnt)); for(int i=0;i<n;i++) { scanf("%d",&pa[i]); int x=pa[i]; for(int j=0;j<32;j++) { a[j]=x%2; x=x/2; } Insert();//建01trie树 } for(int i=0;i<n;i++) { int x=pa[i]; for(int j=0;j<32;j++) { a[j]=x%2; x=x/2; } fun(); } cout << ma << endl; return 0; }