Xor Sum

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others)

Total Submission(s): 4445    Accepted Submission(s): 652

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(n*m)会超时。只是想到去年网赛有道题数据量也非常大直接暴力居然过了于是直接敲了敲,终于还是TLE了。

想到位操作运算符的通用思想,逐位处理,相应本题还是比較easy想到字典树的。Memory Limit: 132768/132768 K (Java/Others),提示能够尝试牺牲空间换取时间。直接字典树空间消耗为2^32,但本题数据相对此规模还是比較小的。一共n个数,总共32*n位。所以空间复杂度为O(n)。能够接受。先用原序列中的数按位建立字典树。然后将查找过程中用待询问数与0xffffffff异或XOR来在字典树上跑。终于找到的即为最大的。

如果按查询的XOR的某个分支不存在。则想还有一分支进行。这样答案可能变小,可是正确的。总的时间复杂度O(m*log(32))。常数能够不计。

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std; const int MAXN=100000*32+100;
__int64 tree[MAXN][2];
__int64 node[MAXN];
__int64 tot; void insert(__int64 a)
{
__int64 j;
int bit,dep=0;
for(j=31;j>=0;j--)
{
bit=((0x1<<j)&a)?0x1:0x0;
if(tree[dep][bit]==0)
{
tree[dep][bit]=tot++;
memset(tree[tree[dep][bit]], 0, sizeof(tree[tree[dep][bit]]));
}
dep=tree[dep][bit];
}
node[dep]=a;
} __int64 Solve(__int64 val)
{
__int64 j,bit;
int dep=0;
for(j=31;j>=0;j--)
{
bit=((0x1<<j)&val)?0x0:0x1;
if(tree[dep][bit])dep=tree[dep][bit];
else dep=tree[dep][bit^1];
}
return node[dep];
} int main()
{
int cas;
__int64 n,m,j,s,a;
int tag=0;
cin>>cas;
while(cas--)
{
tot=1;
scanf("%I64d%I64d",&n,&m);
memset(tree[0],0,sizeof(tree[0]));
while(n--)
{
scanf("%I64d",&a); insert(a);
}
printf("Case #%d:\n",++tag);
while(m--)
{
scanf("%I64d",&s);
printf("%I64d\n",Solve(s));
}
}
return 0;
}

2014百度之星第三题Xor Sum(字典树+异或运算)的更多相关文章

  1. HDU 4825 Xor Sum 字典树+位运算

    点击打开链接 Xor Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others) ...

  2. HDU--4825 Xor Sum (字典树)

    题目链接:HDU--4825 Xor Sum mmp sb字典树因为数组开的不够大一直wa 不是报的 re!!! 找了一下午bug 草 把每个数转化成二进制存字典树里面 然后尽量取与x这个位置上不相同 ...

  3. hdu 4825 xor sum(字典树+位运算)

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

  4. 2014年百度之星资格赛第三题Xor Sum

    Problem Description Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包括了N个正整数,随后 Prometheus 将向 Zeu ...

  5. 2014年百度之星程序设计大赛 - 资格赛 第三题 Xor Sum

    小记:艹蛋呢, 取long long的低30,32,34位都WA, 取31位才AC. .. 思路:依据求数组中两个数异或最大值.參考 代码: #include <stdio.h> #inc ...

  6. 2014百度之星第四题Labyrinth(DP)

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

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

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

  8. 2014 百度之星 题解 1004 Labyrinth

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

  9. HDU 4825 Xor Sum (模板题)【01字典树】

    <题目链接> 题目大意: 给定n个数,进行m次查找,每次查找输出n个数中与给定数异或结果最大的数. 解题分析: 01字典树模板题,01字典树在求解异或问题上十分高效.利用给定数据的二进制数 ...

随机推荐

  1. webdynpro 调用应用程序做跳转

    1.是调用指的是调用生成应用程序,非webdynpro组件程序, 如下: 1)调用页面,并传值 METHOD get_zgmtpage . DATA:lw_application_name TYPE ...

  2. POJ 1955 Rubik's Cube

    暴力模拟就好了.... vim写代码真费事,手都写酸了... Rubik's Cube Time Limit: 1000MS   Memory Limit: 30000K Total Submissi ...

  3. VS2010(2012)中使用Unit Testing进行单元测试

    原文 VS2010(2012)中使用Unit Testing进行单元测试 使用VS 2012自带的Unit Testing工具进行单元测试是非常方便的.网上关于这方面的例子很多,这篇随笔只起个人学习笔 ...

  4. RobotFrameWork(十一)AutoItLibrary测试库在win7(64bit)下安装及简单使用

    最近安装AutoItLibrary,发现在win7 x64下无法安装成功,后来经过定位,发现是3rdPartyTools\AutoIt目录下面AutoItX3.dll的问题.因为AutoItX3.dl ...

  5. maven Nexus 搭建本地中央仓库。

    maven 网络中央仓库占用大量的网络资源,所以构建本地中央仓库. 过程如下: 下载地址: http://www.sonatype.org/nexus/archived 我用的是1.6的 [root@ ...

  6. jQuery遍历函数

    jQuery遍历函数包含了用于筛选.查找和串联元素的方法. .add():将元素加入到匹配元素的集合中. .andSelf():把堆栈中之前的元素集加入到当前集合中. .children():获得匹配 ...

  7. 24位和8位BMP图片保存纯C代码

    BMP图片大家都知道,可以通过查看BMP图片结构使用纯C就可以打开,编辑,处理,保存图片.非常方便使用. 具体BMP结构可以参考:wingdi.h头文件.今天主要在进行删减代码,需要把多余的代码删除, ...

  8. [C++]C++中的运行时类型检测

    Date:2014-1-3 Summary: 使用C++中的运行时类型检测.(文章重点在于记录本人的使用情况,并非深层讨论RTTI) Contents:写习惯C#的我,在C++依然存在哪些.NET的惯 ...

  9. windows mysql安装、配置

    一.MySQL的下载: 上图中,我们选择红框部分的社区版本进行下载,MySQL支持许多平台: 我的操作系统是64位的,选择对应版本MSI版下载,弹出login界面, 选择no thanks,just ...

  10. UVA1455 - Kingdom(并查集 + 线段树)

    UVA1455 - Kingdom(并查集 + 线段树) 题目链接 题目大意:一个平面内,给你n个整数点,两种类型的操作:road x y 把city x 和city y连接起来,line fnum ...