您的位置:首页 > 其它

CSU 1214 找最大异或值

2014-10-22 23:43 323 查看
题目大意:

给定一堆数,从中找2个数异或得到的最大值

直接暴力会超时,我们要考虑对于每一个数去匹配找到异或的最大值,我们希望2进制越前面的数尽可能都为1

所以我们用 0-1 字典树保存这些数,因为一个int型的正整数最多2进制到第30位,所以我们用31层高的字典树保存,第一层为root节点

每次查询操作都是对于当前数的2进制位查找,如果与之相反的方向有点,就往与之相反的方向向下找,这样异或才为1,没有,就顺着当前相同方向向下找,那样异或值为0

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;

int ans;
struct Node{
int num;
Node *next[2];
Node(){
num = 0;
next[0] = NULL;
next[1] = NULL;
}
};

Node *root = new Node();

void add_node(int x)
{
int k = (x&(1<<30)) == 0?0:1;
Node *q;
if(!root->next[k]){
root->next[k] = new Node();
}
q = root->next[k];
for(int i = 29 ; i >= 0 ; i--){
k = (x&(1<<i)) == 0?0:1;
if(!q->next[k])
q->next[k] = new Node();
q = q->next[k];
}
q->num = x;
}

void query(int x)
{
int k = (x&(1<<30)) == 0?0:1;
Node *q;
if(!root->next[k^1]){
q = root->next[k];
}
else q = root->next[k^1];
for(int i = 29 ; i >= 0 ; i--){
k = (x&(1<<i)) == 0?0:1;
if(!q->next[k^1])
q = q->next[k];
else
q = q->next[k^1];
}
//  cout<<" get num : "<<q->num<<endl;
ans = max(ans , q->num ^ x);

}

int main()
{
//freopen("test.in","rb",stdin);
int n,a;
while(~scanf("%d",&n)){
root = new Node();
ans = 0;
for(int i=0;i<n;i++){
scanf("%d",&a);
add_node(a);
query(a);
//cout<<"   jsd: "<<i<<"  "<<ans;
}

printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: