1216: 异或最大值
Time Limit: 2 Sec Memory Limit: 128 Mb Submitted: 836 Solved: 300Description
给定一些数,求这些数中两个数的异或值最大的那个值
Input
多组数据。第一行为数字个数n,1 <= n <= 10 ^ 5。接下来n行每行一个32位有符号非负整数。
Output
任意两数最大异或值
Sample Input
3 3 7 9
Sample Output
14
Hint
Source
CSGrandeur的数据结构习题
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#include<algorithm>
#define MS(a,b) memset(a,b,sizeof(a))
const int N=500000;
int num,val[N];
int ch[N][2],a[N];
void Insert(int x)
{
int u=0,c,i;
for(i=31;i>=0;i--)
{
c=(x>>i)&1;//将十进制数按位转化成二进制数
if(!ch[u][c])
ch[u][c]=num++;
u=ch[u][c];
}
val[u]=x;//在最后的一个结点上标明这个十进制数
}
int Query(int x)
{
int u=0,c,i;
for(i=31;i>=0;i--)
{
c=(x>>i)&1;
if(ch[u][c^1])//要想异或和最大,从最高位开始到最低位依次要相反
u=ch[u][c^1];
else
u=ch[u][c];
}
return val[u];//返回该数异或值最大的那个数
}
int main()
{
int i,n,ans;
while(cin>>n)
{ num=1;
MS(val,0);MS(ch,0);
for(i=0;i<n;i++)
{
cin>>a[i];
Insert(a[i]);
}
ans=-1;
for(i=0;i<n;i++)
ans=max(ans,a[i]^Query(a[i])) ;
cout<<ans<<endl;
}
return 0;
}