CSU 1216 异或最大值

Description

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

Input

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

Output

任意两数最大异或值

Sample Input

3
3
7
9

Sample Output

14


 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstdio>
 4 #include <cstring>
 5 #include <cstdlib>
 6 #include <list>
 7 #include <map>
 8 
 9 using namespace std;
10 
11 const int N = 100005 * 35;
12 
13 int ans, n, arr[N], p;
14 
15 struct Node
16 {
17     Node *next[2];
18 } mem[N], *root;
19 
20 Node *New()
21 {
22     return &mem[p++];
23 }
24 
25 void insert(int x)
26 {
27     if (!root)
28         root = New();
29     Node *rt = root;
30     for (int i = 31; i >= 0; i--)
31     {
32         int t = (x >> i) & 1;
33         if (!rt->next[t])
34             rt->next[t] = New();
35         rt = rt->next[t];
36     }
37 }
38 
39 int ask(int x)
40 {
41     Node *rt = root;
42     int ret = 0;
43     for (int i = 31; i >= 0; i--)
44     {
45         int t = (x >> i) & 1;
46         if (rt->next[!t])
47             ret |= 1 << i, rt = rt->next[!t];
48         else
49             rt = rt->next[t];
50     }
51     return ret;
52 }
53 
54 int main()
55 {
56     while (scanf("%d", &n) == 1)
57     {
58         ans = 0;
59         p = 0;
60         root = NULL;
61         memset(mem, 0, sizeof(mem));
62         for (int i = 1; i <= n; i++)
63             scanf("%d", &arr[i]),
64             insert(arr[i]);
65         for (int i = 1; i <= n; i++)
66             ans = max(ans, ask(arr[i]));
67         printf("%d\n", ans);
68     }
69 }
View Code

 

posted @ 2017-08-09 19:58  KingSann  阅读(120)  评论(0)    收藏  举报