Xor Sum

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

看起来非常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的更多相关文章

  1. 2014百度之星预赛(第二场)——Best Financing

    2014百度之星预赛(第二场)--Best Financing Problem Description 小A想通过合理投资银行理財产品达到收益最大化.已知小A在未来一段时间中的收入情况,描写叙述为两个 ...

  2. 2014百度之星第三题Xor Sum(字典树+异或运算)

    Xor Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others) Total ...

  3. 2014百度之星资格赛—— Xor Sum(01字典树)

    Xor Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others) Total ...

  4. 2014 百度之星 题解 1004 Labyrinth

    Problem Description 度度熊是一仅仅喜欢探险的熊,一次偶然落进了一个m*n矩阵的迷宫,该迷宫仅仅能从矩阵左上角第一个方格開始走,仅仅有走到右上角的第一个格子才算走出迷宫,每一次仅仅能 ...

  5. 2014百度之星资格赛——Disk Schedule

    2014百度拥有明星格比赛--Disk Schedule Problem Description 有非常多从磁盘读取数据的需求,包含顺序读取.随机读取. 为了提高效率.须要人为安排磁盘读取. 然而.在 ...

  6. 2014百度之星初赛第二场hdu 4831 Scenic Popularity

    Scenic Popularity Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  7. 2014 百度之星题解 1002 - Disk Schedule

    Problem Description 有非常多从磁盘读取数据的需求,包含顺序读取.随机读取.为了提高效率,须要人为安排磁盘读取.然而,在现实中,这样的做法非常复杂.我们考虑一个相对简单的场景. 磁盘 ...

  8. 2015 百度之星 1003 棋盘占领 dfs

    棋盘占领 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://bestcoder.hdu.edu.cn/contests/contest_show ...

  9. 2014百度之星资格赛 1004:Labyrinth(DP)

    Labyrinth Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

随机推荐

  1. Spring中的InitializingBean接口

    InitializingBean接口为bean提供了初始化方法的方式,它只有afterPropertiesSet方法,凡是继承该接口的类,在初始化bean的时候会执行该方法. 测试程序如下: impo ...

  2. MyBatis学习总结(18)——MyBatis与Hibernate区别

    也用了这么久的Hibernate和MyBatis了,一直打算做一个总结,就他们之间的优缺点说说我自己的理解: 首先,Hibernate是一个ORM的持久层框架,它使用对象和我们的数据库建立关系,在Hi ...

  3. Redis介绍、安装部署、操作

    学习连接:http://www.runoob.com/redis/redis-tutorial.html 一.Redis介绍 Redis是NoSql的一种. NoSql,全名:Not Only Sql ...

  4. java properties类读取配置文件

    1.JAVA Properties类,在java.util包里,具体类是java.util.properties.Properties类继承自Hashtable类并且实现了Map接口,也是使用一种键值 ...

  5. HDU 4329 Contest 3

    果然换个编译器就过了.总的来说,不难,不过就是处理一些空格.学习了一个新的类 istringstream可以按空格划分.然后,那条式子要理解. 式子的意义是: 找到一个串,该串在query中是第几个找 ...

  6. php利用href进行页面传值的正确姿势

    首先在a.php中 <?php $a = "world"; echo "<a href='b.php?m=$a'>删除</a>"; ...

  7. Oracle 10g RAC (linux) ASM 共享存储的管理详解

    ---------ASM 的管理(共享磁盘的管理)1.以 instance 的方式管理 ASM,启动 database 之前必须先启动 ASM instance,ASM instance 启动后,挂载 ...

  8. [codeforces 894 E] Ralph and Mushrooms 解题报告 (SCC+拓扑排序+DP)

    题目链接:http://codeforces.com/problemset/problem/894/E 题目大意: $n$个点$m$条边的有向图,每条边有一个权值,可以重复走. 第$i$次走过某条边权 ...

  9. OKHttp使用简介

    现在android网络方面的第三方库很多,volley,Retrofit,OKHttp等,各有各自的特点,这边博客就来简单介绍下如何使用OKHttp. 梗概 OKHttp是一款高效的HTTP客户端,支 ...

  10. js函数 DOM操作

    回学校了两天请了两天假,数组和方法的内容周末一定补上! 今天介绍一下JavaScript函数 Function 一.基础内容 1.定义 函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块. f ...