题意:
给你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;
}

京公网安备 11010502036488号