CSU 1216 异或最大值
Description
给定一些数,求这些数中两个数的异或值最大的那个值
Input
多组数据。第一行为数字个数n,1 <= n <= 10 ^ 5。接下来n行每行一个32位有符号非负整数。
Output
任意两数最大异或值
Sample Input
3 3 7 9Sample 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 }