csu-1216: 异或最大值

来源:互联网 发布:云计算和软件工程区别 编辑:程序博客网 时间:2024/05/18 17:43

1216: 异或最大值

    Time Limit: 2 Sec    Memory Limit:128 Mb    Submitted:836    Solved:300    

Description

给定一些数,求这些数中两个数的异或值最大的那个值

Input

多组数据。第一行为数字个数n,1 <= n <= 10 ^ 5。接下来n行每行一个32位有符号非负整数。

Output

任意两数最大异或值

Sample Input

3379

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;}


原创粉丝点击