Xor Sum

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others)
Total Submission(s): 2403    Accepted Submission(s): 1041

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
 先声明自己智障的看错输出的结果,以为输出最大的异或后的值,谁知道与哪个数异或后的值最大,就输出那个数,尴尬还以为样例错了。。。
字典树这样玩真的好酷炫,我是看了用字典树才想到怎么写惭愧,这样真的好巧妙,利用了字典树前缀和的思想在O(len)的时间就能算出结果!
将每个数按二进制33位不够得话高位补零,从高到低位存入字典树中,其实就是一颗只含01的字典树。
之所以由高到低是由于高位决定数的大小(贪心思想),对于读入的每个数也按33位在树上匹配,在满足条件的情况下尽可能的选择与bit不相同的位置走,
这样答案就会最大,最后输出ans^num就是原来的数!
可能动态键树释放内存的操作时间挺慢的跑700+ms,我看静态数组都是200左右
 #include<bits/stdc++.h>
using namespace std;
#define LL long long struct node
{
node *child[];
node(){child[]=child[]=NULL;}
};
node *root;
void Clear(node *p)
{
if(p==NULL) return;
for(int i=;i<;++i){
if(p->child[i]!=NULL) Clear(p->child[i]);
}
delete p;
}
void add(LL num)
{
node *p=root;
int i,bit;
for(i=;i>=;--i){
bit=(num&((LL)<<i))?:;
if(p->child[bit]==NULL)
p->child[bit]=new node();
p=p->child[bit];
}
}
LL solve(LL num)
{
node *p=root;
int i,bit[]; LL ans=;
for(i=;i>=;--i){
bit[]=(num&((LL)<<i))?:;
if(p->child[bit[]^]!=NULL){
p=p->child[bit[]^];
bit[]=;
}
else {p=p->child[bit[]];bit[]=;}
if(bit[]) ans+=((LL)<<i);
}
return ans;
}
int main()
{
int T,N,M,i,j,k=;
LL n;
cin>>T;
while(T--){root=new node();
cin>>N>>M;
for(i=;i<=N;++i){
scanf("%lld",&n);
add(n);
}printf("Case #%d:\n",++k);
for(i=;i<=M;++i){
scanf("%lld",&n);
printf("%lld\n",n^solve(n));
}
Clear(root);
}
return ;
}

最新文章

  1. 初学微信小程序
  2. Delphi编译的程序如何获取管理员权限
  3. C#解析Json(多方法解析Json 一)
  4. 8.MVC框架开发(URL路由配置和URL路由传参空值处理)
  5. PAT 1059. Prime Factors (25) 质因子分解
  6. ckeditor编辑器在java项目中配置
  7. BAD packet signature 18245 错误解决
  8. Akka入门实例
  9. 第九章:Python の 网络编程基础(一)
  10. 5、ABPZero系列教程之拼多多卖家工具 修改User表结构
  11. 升级版updateOozie.sh
  12. 【Devops】【docker】【CI/CD】jenkins源码管理,添加SSH地址后报错+Jenkins构建报错:Please make sure you have the correct access rights and the repository exists.
  13. ios中键盘处理源码
  14. unity3d 读取usb摄像头
  15. tomcat如何配置context的docBase
  16. Spark 编程模型(中)
  17. php 实现 java com.sun.org.apache.xml.internal.security.utils.Base64 Byte数组加密
  18. 【bzoj4709】[Jsoi2011]柠檬 斜率优化
  19. maven 介绍(一)
  20. 如何使用cntlm配置代理上网

热门文章

  1. 20165324 《Java程序设计》第八周学习总结
  2. boost::any 用法
  3. 接口返回值结果转换成JSON
  4. Django框架_URLconf、Views、template、ORM
  5. React:快速上手(6)——掌握React Router
  6. 2017 Multi-University Training Contest - Team 3 Kanade&#39;s sum hd6058
  7. 【Android】WebView读取本地图片
  8. JQueryEasyUI easyui-combobox 单击文本区域显示下拉菜单
  9. Ubuntu 16.04 安装Postman
  10. Web前端学习笔记之JavaScript、jQuery、AJAX、JSON的区别