2014 百度之星 1003 题解 Xor Sum
Xor Sum
Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包括了N个正整数,随后 Prometheus 将向 Zeus 发起M次询问,每次询问中包括一个正整数 S ,之后 Zeus 须要在集合其中找出一个正整数 K ,使得 K 与 S 的异或结果最大。 Prometheus 为了让 Zeus 看到人类的伟大,随即允许 Zeus 能够向人类求助。你能证明人类的智慧么?
输入包括若干组測试数据,每组測试数据包括若干行。
输入的第一行是一个整数T(T < 10),表示共同拥有T组数据。 每组数据的第一行输入两个正整数N,M(<1=N,M<=100000)。接下来一行,包括N个正整数,代表 Zeus 的获得的集合,之后M行,每行一个正整数S,代表 Prometheus 询问的正整数。 全部正整数均不超过2^32。
对于每组数据。首先须要输出单独一行”Case #?:”。当中问号处应填入当前的数据组数。组数从1開始计算。
对于每一个询问,输出一个正整数K,使得K与S异或值最大。
2
3 2
3 4 5
1
5
4 1
4 6 5 6
3
Case #1:
4
3
Case #2:
4
看起来非常easy的题目,由于使用暴力法的代码非常easy,可是这道题使用暴力法超时,所以就成为难题了。
题目应该使用Trie数据结构去解。并且是Trie的基本构建和搜索了。
和一般的Trie不同,就是不用26个分支了,这里仅仅有两个分支,那么就更加简单了。
我一直都不太喜欢杭电的OJ。就是由于他们的输入输出感觉不够智能。尾部多个换行符或者少个换行符都不成,一般OJ都无论这个推断答案的了。
并且本题使用自家写的IO也不行,浪费我不少时间。
我这道题是从高位到低位构建Trie的。也是从高位到低位搜索。并且树高是固定33. 搜索效率接近常数.
以下是收拾过的代码。带上释放内存,形成良好的编程习惯。
#include <stdio.h>
#include <stdlib.h>
#include <bitset>
using std::bitset; class XorSum1003_4
{
struct Node
{
Node *children[2];
explicit Node()
{
children[0] = NULL;
children[1] = NULL;
}
~Node()
{
if (children[0]) delete children[0];
if (children[1]) delete children[1];
}
};
struct Tree
{
Node *emRoot;
Tree()
{
emRoot = new Node;
}
~Tree()
{
if (emRoot) delete emRoot;
}
}; Tree *trie;
void insertNode(long long n)
{
bitset<33> bs = n;
Node *pCrawl = trie->emRoot;
for (int i = 32; i >= 0 ; i--)
{
if (!pCrawl->children[bs[i]])
{
pCrawl->children[bs[i]] = new Node;
}
pCrawl = pCrawl->children[bs[i]];
}
} long long serachXor(long long n)
{
bitset<33> bs = n;
bitset<33> ans;
Node *pCrawl = trie->emRoot;
for (int i = 32; i >= 0 ; i--)
{
if (bs[i])
{
if (pCrawl->children[0])
{
ans[i] = 0;
pCrawl = pCrawl->children[0];
}
else
{
ans[i] = 1;
pCrawl = pCrawl->children[1];
}
}
else
{
if (pCrawl->children[1])
{
ans[i] = 1;
pCrawl = pCrawl->children[1];
}
else
{
ans[i] = 0;
pCrawl = pCrawl->children[0];
}
}
}
return ans.to_ullong();
}
public:
XorSum1003_4() : trie(NULL)
{
int T, N, M;
scanf("%d", &T);
for (int i = 1; i <= T; i++)
{
if (trie) delete trie;
trie = new Tree; printf("Case #%d:\n", i); scanf("%d %d", &N, &M);
long long a, b;
for (int k = 0; k < N; k++)
{
scanf("%I64d", &a);
insertNode(a);
}
for (int k = 0; k < M; k++)
{
scanf("%I64d", &a);
b = serachXor(a);
printf("%I64d\n", b);
}
}
}
~XorSum1003_4()
{
if (trie) delete trie;
}
};
2014 百度之星 1003 题解 Xor Sum的更多相关文章
- 2014百度之星预赛(第二场)——Best Financing
2014百度之星预赛(第二场)--Best Financing Problem Description 小A想通过合理投资银行理財产品达到收益最大化.已知小A在未来一段时间中的收入情况,描写叙述为两个 ...
- 2014百度之星第三题Xor Sum(字典树+异或运算)
Xor Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others) Total ...
- 2014百度之星资格赛—— Xor Sum(01字典树)
Xor Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others) Total ...
- 2014 百度之星 题解 1004 Labyrinth
Problem Description 度度熊是一仅仅喜欢探险的熊,一次偶然落进了一个m*n矩阵的迷宫,该迷宫仅仅能从矩阵左上角第一个方格開始走,仅仅有走到右上角的第一个格子才算走出迷宫,每一次仅仅能 ...
- 2014百度之星资格赛——Disk Schedule
2014百度拥有明星格比赛--Disk Schedule Problem Description 有非常多从磁盘读取数据的需求,包含顺序读取.随机读取. 为了提高效率.须要人为安排磁盘读取. 然而.在 ...
- 2014百度之星初赛第二场hdu 4831 Scenic Popularity
Scenic Popularity Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- 2014 百度之星题解 1002 - Disk Schedule
Problem Description 有非常多从磁盘读取数据的需求,包含顺序读取.随机读取.为了提高效率,须要人为安排磁盘读取.然而,在现实中,这样的做法非常复杂.我们考虑一个相对简单的场景. 磁盘 ...
- 2015 百度之星 1003 棋盘占领 dfs
棋盘占领 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://bestcoder.hdu.edu.cn/contests/contest_show ...
- 2014百度之星资格赛 1004:Labyrinth(DP)
Labyrinth Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
随机推荐
- 【codeforces 799D】Field expansion
[题目链接]:http://codeforces.com/contest/799/problem/D [题意] 给你长方形的两条边h,w; 你每次可以从n个数字中选出一个数字x; 然后把h或w乘上x; ...
- oracle 控制语句
PL输出语句 set serverout on; -- 开启PL的输出语句功能declare n number:=1; -- 声明一个number型的变量n,并赋值为1 v varchar2(20): ...
- jquery-layer.closeAll不执行的错觉
在使用ajax.form提交的时候,弹出了layer插件的页面,于是我想使用layer插件提供的layer.closeAll()方法讲这个弹出的页面关闭,但是尝试了很久不行,到底是为什么呢? 过了一段 ...
- spark源代码action系列-foreach与foreachPartition
RDD.foreachPartition/foreach的操作 在这个action的操作中: 这两个action主要用于对每一个partition中的iterator时行迭代的处理.通过用户传入的fu ...
- JAVA设计模式之【建造者模式】
建造者模式 建造者模式为客户端返回的不是一个简单的产品,而是一个由多个部件组成的复杂产品 角色 Builder抽象建造者 buildPartX getResult ConcreteBuilder具体建 ...
- Redis和Memcache和MongoDB简介及区别分析(整理)
Redis和Memcache 一.Redis简介 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.从2010年 ...
- Oracle11g数据库导入Oracle10g数据库操作笔记
一.在11g服务器上,使用expdp命令备份数据 EXPDP USERID='SYS/sys@daggis as sysdba' schemas=oa directory=DATA_PUMP_DIR ...
- 138.安全退出的异常,要用throw 尽量不用exit(0)
#include<iostream> #include<cstdlib> using namespace std; ////非安全退出,结束进程, //C++ 必须释放对象,最 ...
- Android TextView加上阴影效果
<TextView android:id="@+id/test_shadow" android:layout_width="wrap_content" a ...
- 编译Speex生成so库文件(android-speex)
项目中需要用音频格式转换,之前使用VoAacEncoder,部分手机总是莫名崩溃,所以决定不再使用VoAacEncoder,换做Speex来完成格式转换,但是没有找到Speex的库文件,网上介绍的都是 ...