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 ;
}

HDU 4825 Trie树 异或树!的更多相关文章

  1. hdu 4825 && acdream 1063 01字典树异或问题

    题意: 给一个集合,多次询问,每次给一个k,问你集合和k异或结果最大的哪个 题解: 经典的01字典树问题,学习一哈. 把一个数字看成32位的01串,然后查找异或的时候不断的沿着^为1的路向下走即可 # ...

  2. HDU 4825 Xor Sum(字典树)

    嗯... 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4825 这道题更明确的说是一道01字典树,如果ch[u][id^1]有值,那么就向下继续查找/ ...

  3. HDU 4825 Xor Sum(经典01字典树+贪心)

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

  4. 字典树 && 例题 Xor Sum HDU - 4825 (板子)

    一.字典树描述:Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的优 ...

  5. 【HDU - 5790 】Prefix(主席树+Trie树)

    BUPT2017 wintertraining(15) #7C 题意 求[min((Z+L)%N,(Z+R)%N)+1,max((Z+L)%N,(Z+R)%N)+1]中不同前缀的个数,Z是上次询问的结 ...

  6. HDU 4825 字典树

    HDU 4825 对于给定的查询(一个整数),求集合中和他异或值最大的值是多少 按位从高位往低位建树,查询时先将查询取反,然后从高位往低位在树上匹配,可以匹配不可以匹配都走同一条边(匹配表示有一个异或 ...

  7. HDU 4757 Tree 可持久化字典树

    Tree Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=4757 Des ...

  8. 讲解——Trie树(字典树)

          Trie树(字典树) 一.引入 字典是干啥的?查找字的. 字典树自然也是起查找作用的.查找的是啥?单词. 看以下几个题: 1.给出n个单词和m个询问,每次询问一个单词,回答这个单词是否在单 ...

  9. 浅谈Trie树(字典树)

          Trie树(字典树) 一.引入 字典是干啥的?查找字的. 字典树自然也是起查找作用的.查找的是啥?单词. 看以下几个题: 1.给出n个单词和m个询问,每次询问一个单词,回答这个单词是否在单 ...

随机推荐

  1. FileLoadTools

    /** * Created by dev013 on 9/9/14. */ var FileLoadTools = (function () { var my = {}; var htmlFile = ...

  2. Python(异常处理)

    一 错误和异常 程序中难免出现错误,而错误分成两种 1.语法错误(这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正) 2.逻辑错误(逻辑错误) 什么是异常 异常就是程序运行时发 ...

  3. Outputting Strings in the Console

    Outputting Strings in the Console #include <windows.h> class Console {public:  enum fore_color ...

  4. Zen cart 根据数量打折插件

    Quantity Discounts 可以根据顾客购买多少来打折,很不错. 假如顾客买了3个以上的产品,就给他10%折扣,设置如下: Turn On Quantity Discount 1. In t ...

  5. MySQL数据库--练习

    学生选课系统 设计表关系 创建表和插入数据 /* Navicat MySQL Data Transfer Source Server : localhost_3306 Source Server Ve ...

  6. ruby中的方法查找

    ruby中的方法调用都是 对象.方法 的形式,那么对象如何找到这个方法呢? 首先必须了解祖先链的概念,祖先链就是从一个类开始,到它的父类,再到父类的父类...一直到最终的起点(ruby中是BasicO ...

  7. Git-基本操作(同SVN)

    本人拜读了廖雪峰老师关于Git的讲述后整理所得 1.创建版本库: 版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改.删 ...

  8. 关于ldap的学习

    主要从以下网站学习了相关基础知识概念,安装与基本配置. http://www.aikaiyuan.com/8269.htmlhttps://segmentfault.com/a/11900000026 ...

  9. NGUI基本事件

    You can add the following functions to your scripts placed on widgets or in-game objects with a coll ...

  10. LigerUI ligerComboBox 下拉框 表格 多选无效

    $("#txt1").ligerComboBox({ width: 250, slide: false, selectBoxWidth: 500, selectBoxHeight: ...