Xor Sum

Time Limit: 1000 MS

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

给出n个数,m次查询,每次查询输出异或值最大的那个数。

01字典树,原来字典树还有这种操作。

从高位向低位创建一棵字典树,val记录字典树的节点所代表的数值,查询的时候从高位开始向低位查询,每次贪心找到异或值最大的,输出该节点所代表的数值。

#include "bits/stdc++.h"
using namespace std;
typedef long long LL;
const int maxn = 100000 + 10;
int ch[32*maxn][2];LL val[32*maxn];
int sz;
void init(){memset(ch[0], 0 ,sizeof(ch[0]));sz = 1;}
void insert_01tree(LL a){int u = 0;for(int i = 31; i >= 0; i--) {int c = ((a>>i)&1);if(!ch[u][c]){//新开节点,使得上一级的节点指向新开的节点memset(ch[sz], 0, sizeof(ch[sz])); val[sz]=0;ch[u][c] = sz++;}u = ch[u][c];}val[u] = a; //储存当前的值
}
LL query(LL a){int u = 0;for(int i = 31; i >= 0; i--){int c = ((a>>i)&1);if(ch[u][c^1]) u = ch[u][c^1];else u = ch[u][c];}return val[u];}
int main(int argc, char const *argv[]){int T;int Kcase = 0;scanf("%d", &T);while (T--) {LL a; init();int N, M;scanf("%d%d", &N, &M);for (int i = 0; i < N; i++) {scanf("%lld", &a);insert_01tree(a);}printf("Case #%d:\n", ++Kcase);while (M--) {scanf("%lld", &a);printf("%lld\n", query(a));}}return 0;
}

Chip Factory

题意:

给一个数组A,从A中找到两个数使得两个数的和和数组中的另外一个的异或最大

枚举每两个数,将它们从字典树上删去,再查找和他们异或和最大的,然后在把两个数加到字典树上。用一个数组num记录每个数在字典树上的贡献,删去一个数只要把它的贡献减去就可以了。

#include "bits/stdc++.h"
using namespace std;
typedef long long LL;
const int maxn = 1e5;
LL a[maxn], val[maxn];
int ch[maxn][2], num[maxn];
int sz = 1;
void insert_01tree(LL x) {int u = 0;for (int i = 32; i >= 0; i--) {int c = ((x>>i)&1);if (!ch[u][c]) {memset(ch[sz], 0, sizeof(ch[sz]));num[sz] = 0; val[sz] = 0;ch[u][c] = sz++;}u = ch[u][c]; num[u]++; }val[u] = x;
}
void updata(LL x, int d) {int u = 0;for (int i = 32; i >= 0; i--) {int c = ((x>>i)&1);u = ch[u][c];num[u] += d;}
}
LL query(LL x) {int u = 0; for (int i = 32; i >= 0; i--) {int c = ((x>>i)&1);if(num[ch[u][c^1]] and ch[u][c^1]) u = ch[u][c^1];else u = ch[u][c];}return val[u];
}
void init() {memset(ch[0], 0, sizeof(ch[0]));memset(val, 0, sizeof(val));memset(num, 0, sizeof(num));sz = 1;
}
int main(int argc, char const *argv[])
{int T;scanf("%d", &T);while (T--) {init();int N;LL maxx = 0;scanf("%d", &N);for (int i = 0; i < N; i++) scanf("%lld", a+i), insert_01tree(a[i]);for (int i = 0; i < N; i++) {for (int j = i + 1; j < N; j++) {updata(a[i], -1); updata(a[j], -1);maxx = max(maxx ,(a[i]+a[j]) xor query(a[i]+a[j]));updata(a[i], 1); updata(a[j], 1);}}printf("%lld\n", maxx);}return 0;
}

转载于:https://www.cnblogs.com/cniwoq/p/7345302.html

HDU4825/5536 [01 字典树/简单字典树更新]相关推荐

  1. 线段树-简单线段树模板

    简单线段树 2021年7月30 线段树是干什么的? 更新,维护,查询某区间的某项值,如区间和等. 线段树的原理 与树状数组类似,线段树通过直接建树来保存区间的结点,如图: 如何建图? 下面以求序列区间 ...

  2. python树的实现_Python实现简单字典树的方法

    本文实例讲述了Python实现简单字典树的方法.分享给大家供大家参考,具体如下: #coding=utf8 """代码实现了最简单的字典树,只支持由小写字母组成的字符串. ...

  3. python 实现字典树_Python实现简单字典树的方法

    本文实例讲述了Python实现简单字典树的方法.分享给大家供大家参考,具体如下: #coding=utf8 """代码实现了最简单的字典树,只支持由小写字母组成的字符串. ...

  4. 从Trie树(字典树)和后缀树

    从Trie树(字典树)谈到后缀树 转载:http://blog.csdn.net/v_july_v/article/details/6897097#t22 感谢作者,侵删. 引言 常关注本blog的读 ...

  5. 0x16.基本数据结构 — Trie树(字典树)+ A C 自 动 机

    目录 用TrieTrieTrie树来处理整数异或问题是真的舒服! 一.TrieTrieTrie树 TrieTrieTrie的基本操作 0.初始化 1.插入 2.检索 二.TrieTrieTrie树例题 ...

  6. 字典树(trie树)、后缀树

    (1)字典树(Trie树) Trie是个简单但实用的数据结构,通常用于实现字典查询.我们做即时响应用户输入的AJAX搜索框时,就是Trie开始.本质上,Trie是一颗存储多个字符串的树.相邻节点间的边 ...

  7. 前缀树(字典树,单词查找树,Trie树)

    参考网址:https://blog.csdn.net/u013949069/article/details/78056102?utm_source=copy 概述 前缀树又名字典树,单词查找树,Tri ...

  8. 【字典树】字典树的创建(入门详细介绍)

    Part one[何谓字典树] 又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计. ...

  9. 字典树(Tire树)C++详解,一文让你理解字典树

    问题引入 现在,我给你n个单词,然后进行q次询问,每一次询问一个单词b,问你b是否出现在n个单词中,你会如何去求呢? 暴力搜索?但是我们如果这么做的话时间复杂度一下就高上去了.大家都是成熟的ACMer ...

  10. Tire树(字典树-字符串快速查找)

    前言 一.Tire树是什么? 二.怎么建立tire树 1.字符串插入Tire树入 2.查找字符串 总结 前言: 最近是在复习基础算法,正好复习到了数据结构,所以写了自己对Tire树的理解,数据结构对我 ...

最新文章

  1. [USACO1.4]等差数列 Arithmetic Progressions
  2. 神策数据荣登毕马威中国领先消费科技 50 企业
  3. 0222互联网新闻 | 快手推游戏直播App“电喵直播”及工具型App光音Mulight;“AI音乐学院”完成PreA轮融资...
  4. C语言 二维数组做函数参数的几种情况
  5. 心疼还在用Facebook的你一秒,Snapchat才是未来
  6. 多个漏洞可被用于破坏劫持施耐德 PowerLogic 设备
  7. [转载] python strptime函数转时间数组_python—时间与时间戳之间的转换
  8. vs中能编译通过,但是会有红色下划线提示未定义标示符问题
  9. 凸优化第四章凸优化问题 4.6广义不等式约束
  10. 屏幕录像专家7.5注册机
  11. 中国市场 Android App 兼容性报告
  12. Git入门之日志和版本回退
  13. 情境领导者-第六章、产生胜利者 故事
  14. 【最新版全插件】多功能同城优选小程序源码
  15. linux显卡驱动程序,在Linux下安装显卡驱动程序
  16. 代码迁移_三种类型的代码迁移
  17. 使用Fireworks和Icofx制作一个ICO图标
  18. 智慧校园:学校机房如何实现科学化管理?
  19. [导入]2006TVB年度大戏《汇通天下》全32集[DVD双语字幕]
  20. 论文修改建议(WangLR 20211012 第一次通篇检查)

热门文章

  1. paip.函数式编程方法概述以及总结
  2. paip.invalid conversion from FormWdg* to SOCKET {aka unsigned int}
  3. paip.数据库全文检索 attilax总结
  4. 解密游走于法律边缘的爬虫技术
  5. linux命令增删改查,hw_linux_study_day003,Linux系统终端中的增删改查命令
  6. 【细胞分割】基于matlab GUI生物细胞计数【含Matlab源码 758期】
  7. 【语音去噪】基于matlab改进谱减法语音去噪【含Matlab源码 569期】
  8. 【语音合成】基于matlab语音信号变速【含Matlab源码 565期】
  9. python语言用什么编译器_如何修改python语言pycharm工具的默认编译器
  10. 脸部识别算法_面部识别技术是种族主义者吗? 先进算法的解释