您的位置:首页 > 其它

求两个数异或最大值

2015-11-10 23:14 274 查看
题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=98837#problem/I

[b]题意:给定一些数,求这些数中异或值最大的值[/b]

分析:每个数都可以写成二进制,可以建立一颗字典树

#include<bits/stdc++.h>

using namespace std;

#define INF 0x3f3f3f3f

const int N = 100000<<5;

struct Trie {
int a[2];
int num;
} f
;

int cnt, ans;

// insert x into the root which id is u, the deep is num
void insert(int x, int u, int num)
{
bool k;
for (int i = num; i >= 0; i--)
{
k = (1<<i)&x;
if (f[u].a[k] == -1)
f[u].a[k] = ++cnt;
u = f[u].a[k];
}
f[u].num = x;
}

// query xor
void query(int x, int u, int num)
{
bool k;
for (int i = num; i >= 0; i--)
{
k = (1<<i)&x;
if (f[u].a[!k] != -1)
u = f[u].a[!k];
else
u = f[u].a[k];
}
ans = max(ans, f[u].num^x);
}

int main()
{
int n, t;
while(scanf("%d", &n)!=EOF)
{
memset(f, -1, sizeof(Trie) * N);
cnt = 0;
ans = 0;
while (n--)
{
scanf("%d", &t);
insert(t, 0, 31);
query(t, 0, 31);
}
printf("%d\n", ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: