hdu 4825 xor sum(字典树+位运算)
Posted 十年换你一句好久不见
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu 4825 xor sum(字典树+位运算)相关的知识,希望对你有一定的参考价值。
Xor Sum
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others)
Total Submission(s): 4144 Accepted Submission(s): 1810
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。
输入的第一行是一个整数T(T < 10),表示共有T组数据。
每组数据的第一行输入两个正整数N,M(<1=N,M<=100000),接下来一行,包含N个正整数,代表 Zeus 的获得的集合,之后M行,每行一个正整数S,代表 Prometheus 询问的正整数。所有正整数均不超过2^32。
Output
对于每组数据,首先需要输出单独一行”Case #?:”,其中问号处应填入当前的数据组数,组数从1开始计算。
对于每个询问,输出一个正整数K,使得K与S异或值最大。
对于每个询问,输出一个正整数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
字典树保存
#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> #include <vector> #include <queue> #include <stack> #include <cstdlib> #include <iomanip> #include <cmath> #include <cassert> #include <ctime> #include <map> #include <set> using namespace std; #pragma comment(linker, "/stck:1024000000,1024000000") #define lowbit(x) (x&(-x)) #define max(x,y) (x>=y?x:y) #define min(x,y) (x<=y?x:y) #define MAX 100000000000000000 #define MOD 1000000007 #define pi acos(-1.0) #define ei exp(1) #define PI 3.1415926535897932384626433832 #define ios() ios::sync_with_stdio(true) #define INF 0x3f3f3f3f #define mem(a) (memset(a,0,sizeof(a))) typedef long long ll; int t,n,m,T; struct tree { struct tree *next[2]; int val; tree() { val=0; for(int i=0;i<2;i++) next[i]=NULL; } }; tree *root; void insert(int x) { int a[34]; tree *p=root,*q; for(int i=0;i<32;i++) a[i]=(x&(1<<i))?1:0; for(int i=31;i>=0;i--) { if(p->next[a[i]]==NULL) { q=new tree(); p->next[a[i]]=q; } p=p->next[a[i]]; } p->val=x; } void query(int x) { tree *p=root; int a[34]; for(int i=0;i<32;i++) a[i]=x&(1<<i)?1:0; for(int i=31;i>=0;i--) { if(!p->next[a[i]^1]) p=p->next[a[i]]; else p=p->next[a[i]^1]; } printf("%d\n",p->val); } void del(tree *root) { for(int i=0;i<2;i++) if(root->next[i]!=NULL) del(root->next[i]); free(root); } int main() { scanf("%d",&t); T=t; while(t--) { root=new tree(); scanf("%d%d",&n,&m); for(int i=0,x;i<n;i++) { scanf("%d",&x); insert(x); } printf("Case #%d:\n",T-t); for(int i=0,x;i<m;i++) { scanf("%d",&x); query(x); } del(root); } return 0; }
以上是关于hdu 4825 xor sum(字典树+位运算)的主要内容,如果未能解决你的问题,请参考以下文章