hdoj 4825 Xor Sum 【字典树】
2016-01-14 20:23
323 查看
Xor Sum
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others)Total Submission(s): 1020 Accepted Submission(s): 411
Problem Description
Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包含了N个正整数,随后 Prometheus 将向 Zeus 发起M次询问,每次询问中包含一个正整数 S ,之后 Zeus 需要在集合当中找出一个正整数 K ,使得 K 与 S 的异或结果最大。Prometheus 为了让 Zeus 看到人类的伟大,随即同意 Zeus 可以向人类求助。你能证明人类的智慧么?
Input
输入包含若干组测试数据,每组测试数据包含若干行。
输入的第一行是一个整数T(T < 10),表示共有T组数据。
每组数据的第一行输入两个正整数N,M(<1=N,M<=100000),接下来一行,包含N个正整数,代表 Zeus 的获得的集合,之后M行,每行一个正整数S,代表 Prometheus 询问的正整数。所有正整数均不超过2^32。
Output
对于每组数据,首先需要输出单独一行”Case #?:”,其中问号处应填入当前的数据组数,组数从1开始计算。
对于每个询问,输出一个正整数K,使得K与S异或值最大。
Sample Input
2
3 2
3 4 5
1
5
4 1
4 6 5 6
3
Sample Output
Case #1:
4
3
Case #2:
4
思路:很裸的字典树了,把每个数的二进制搞出来,建好Trie就OK了。
AC代码:
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <cstdlib> #include <algorithm> #include <queue> #include <stack> #include <map> #include <set> #include <vector> #include <string> #define INF 0x3f3f3f3f #define eps 1e-8 #define MAXN (4000000+10) #define MAXM (200000+10) #define Ri(a) scanf("%d", &a) #define Rl(a) scanf("%lld", &a) #define Rf(a) scanf("%lf", &a) #define Rs(a) scanf("%s", a) #define Pi(a) printf("%d\n", (a)) #define Pf(a) printf("%.2lf\n", (a)) #define Pl(a) printf("%lld\n", (a)) #define Ps(a) printf("%s\n", (a)) #define W(a) while(a--) #define CLR(a, b) memset(a, (b), sizeof(a)) #define MOD 1000000007 #define LL long long #define lson o<<1, l, mid #define rson o<<1|1, mid+1, r #define ll o<<1 #define rr o<<1|1 #define PI acos(-1.0) using namespace std; struct Trie{ int next[MAXN][2], root, L, word[MAXN]; int newnode() { for(int i = 0; i < 2; i++) next[L][i] = -1; word[L++] = 0; return L-1; } void init() { L = 0; root = newnode(); } void Insert(int val) { int u = root, v; for(int i = 30; i >= 0; i--) { v = (val & (1<<i)) ? 1 : 0; if(next[u][v] == -1) next[u][v] = newnode(); u = next[u][v]; word[u]++; } } void Delete(int val) { int u = root, v; for(int i = 30; i >= 0; i--) { v = (val & (1<<i)) ? 1 : 0; u = next[u][v]; word[u]--; } } int Query(int val) { int u = root, v; int ans = 0; for(int i = 30; i >= 0; i--) { v = (val & (1<<i)) ? 1 : 0; if(v == 1) { if(next[u][0] != -1 && word[next[u][0]]) u = next[u][0]; else u = next[u][1], ans |= (1 << i); } else { if(next[u][1] != -1 && word[next[u][1]]) u = next[u][1], ans |= (1 << i); else u = next[u][0]; } } return ans; } }; Trie solve; int main() { int t, kcase = 1; Ri(t); W(t) { int N, Q, K, a; Ri(N); Ri(Q); solve.init(); W(N) scanf("%d", &a), solve.Insert(a); printf("Case #%d:\n", kcase++); W(Q) Ri(K), Pi(solve.Query(K)); } return 0; }
相关文章推荐
- hdoj 4824 Disk Schedule 【TSP】
- sudo 在普通用户下使用出错
- jdk配置正确但是tomcat服务器启动时一闪而过
- 从Java回调机制分析Android动态加载布局过程中出现的IllgalStateException
- [转] C语言常见笔试题大全1
- AlwaysOn 同步时间的测试
- 常见JVM监控工具用法介绍
- hdoj 4823 Energy Conversion 【模拟】
- iOS应用生命周期相关内容
- hdoj 2224 && poj 2677 The shortest path 【TSP】
- Codeforces 616E Sum Of Reminders
- GDB调试命令
- android apk 防止反编译技术第二篇-运行时修改Dalvik指令
- android混淆去掉日志
- 从编译到制作固件
- GDB调试多进程程序
- JVM监控工具用法指导
- Java笔记7:最简单的网络请求Demo
- Android 图片处理之 Fresco
- HTML5(二) canvas基础