题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=98837#problem/I
题意:给定一些数,求这些数中异或值最大的值
分析:每个数都可以写成二进制,可以建立一颗字典树
#include<bits/stdc++.h> using namespace std; #define INF 0x3f3f3f3f const int N = 100000<<5; struct Trie { int a[2]; int num; } f[N]; 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 ", ans); } return 0; }