求两个数异或最大值
2015-11-10 23:14
274 查看
题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=98837#problem/I
[b]题意:给定一些数,求这些数中异或值最大的值[/b]
分析:每个数都可以写成二进制,可以建立一颗字典树
[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; }
相关文章推荐
- Jquery输入框获得/失去焦点方式
- 图片缓存问题
- 图片缓存问题
- Android获取屏幕宽高
- 深入理解Java的接口和抽象类
- Linux驱动虚拟地址和物理地址的映射
- hyperic官方文档
- Java syncronized 用法及使用注意事项
- 机器学习4 CF推荐算法
- Sqlmap使用方法
- 转:各种文本格式转换的网站
- java Date与String的转换
- 机器学习3 Kmeans原理和实现
- Java数据结构 遍历 排序 查找 算法实现
- xcode7 Cocoapods 插件用法
- 多进程和多线程比较
- 机器学习2 KNN原理和实现
- # Markdown 语法和 MWeb 写作使用说明
- [Leetcode]Ugly Number II
- JDK中数据类型Character、Double、Float