题意:
      给你n个数,然后给你m组询问,每组询问给你一个数,输出n个数中与该数亦或
的最大的那个数,输出的是被亦或的那个数,不是亦或后的结果。

思路:
      我用的是字典树+贪心,首先我们可以把前n个数拆成2进制,然后补全前导0,

我是补成了34位,然后把他存在字典树中,对于每个询问,把他变成二进制,然后补全前导0,然后在把每一位都取反,在字典树上查找,查找的时候用贪心的思想,因为前面的是高位,所以相等就走相等的,不行再走不相等的那个,反正都是34位,怎么走都有路,一直找到最后,在某一位上如果当前这一位一样了,那么sum += 当前这一位的权值(2^**),然后return sum,输出的时候不能直接输出sum求的是被异或的那个值,所以输出 sum ^ num,根据的是 a ^ b ^ a = b,还有一点要注意的就是一开始超时了,后来把 %2 改成 &1就400+ ms AC了.


#include<stdio.h>
#include<string.h>
#include<stdlib.h>

typedef struct Tree
{Tree *next[2];
}Tree;Tree root;void Buid_Tree(char *str)
{int len = 34;Tree *p = &root ,*q;for(int i = 0 ;i < len ;i ++){int id = str[i] - '0';if(p -> next[id] == NULL){q = (Tree *) malloc(sizeof(root));for(int j = 0 ;j < 2 ;j ++)q -> next[j] = NULL;p ->next[id] = q;p = p -> next[id];}else p = p -> next[id];}
}__int64 Find(char *str)
{int len = 34;Tree *p = &root;__int64 K = 2;K <<= 32;__int64 sum = 0;for(int i = 0 ;i < len ;i ++){int id = str[i] - '0';if(p -> next[id] == NULL)p = p -> next[id ^ 1];else{p = p -> next[id];sum += K;}K = K / 2;}return sum;
}void get_str(char *str ,__int64 num)
{int t = 34;str[t] = '\0';while(num){str[--t] = (num & 1) + '0';num >>= 1;}for(int i = t - 1 ;i >= 0 ;i --)str[i] = '0';
}int main ()
{int i ,t ,n ,m ,cas = 1;__int64 num;char str[50];scanf("%d" ,&t);while(t--){scanf("%d %d" ,&n ,&m);root.next[0] = root.next[1] = NULL;while(n--){scanf("%I64d" ,&num);get_str(str ,num);Buid_Tree(str);}printf("Case #%d:\n" ,cas ++);while(m--){scanf("%I64d" ,&num);get_str(str ,num);for(i = 0 ;i < 34 ;i ++)if(str[i] == '1') str[i] = '0';else str[i] = '1';printf("%I64d\n" ,Find(str) ^ num);}}return 0;
}

hdu4825 字典树 + 贪心相关推荐

  1. 2014百度之星 Xor Sum(字典树+贪心)

    题目在HDU_OJ Problem Description Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包含了N个正整数,随后 Prometh ...

  2. HDU 5536 Chip Factory 字典树+贪心

    给你n个数,a1....an,求(ai+aj)^ak最大的值,i不等于j不等于k 思路:先建字典树,暴力i,j每次删除他们,然后贪心找k,再恢复i,j,每次和答案取较大的,就是答案,有关异或的貌似很多 ...

  3. HDU多校1 - 6955 Xor sum(字典树+贪心)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的序列,要求找到一段长度最短的区间,使得异或和大于等于 kkk,如果有多种答案,输出左端点最小的那个 题目分析:倒着维护一下后缀异或和,将后缀异或 ...

  4. 2019 杭电多校 HDU - 6625 three arrays 字典树+贪心

    题目链接:https://cn.vjudge.net/problem/HDU-6625 题意:a和b两个数组n个数,数字任意组合异或,求得到c数组的字典序最小 题解:对于两个数组从高位到低位建立两个字 ...

  5. hdu4825 字典树 XOR

    用字典树思想来做.对于一个数,给出他的二进制,然后更具二进制建立字典树,然后每次询问的时候的数也给出二进制,如果当前为1,那就向0走,为0,向1走. #include<stdio.h> # ...

  6. 【贪心】【字典树】Gym - 101466A - Gaby And Addition

    题意:定义一种无进位加法运算,给你n个正整数,问你取出两个数,使得他们加起来和最大/最小是多少. 无进位加法运算,其实是一种位运算,跟最大xor那个套路类似,很容易写出对于每个数字,其对应的最优数字是 ...

  7. codeforces 842 D. Vitya and Strange Lesson(01字典树+思维+贪心)

    题目链接:http://codeforces.com/contest/842/problem/D 题解:像这种求一段异或什么的都可以考虑用字典树而且mex显然可以利用贪心+01字典树,和线段树差不多就 ...

  8. [2020-11-23 contest]图(dfs剪枝),劫富济贫(字典树),小A的树(树形DP),游戏(贪心/斜率优化)

    文章目录 T1:图 solution code T2:劫富济贫 solution code T3:小A的树 solution code T4:游戏 solution code T1:图 [问题描述] ...

  9. LeetCode Maximum XOR of Two Numbers in an Array(贪心、字典树)

    问题:给出一个非空的整数数组,找到最大的两个数的异或值.要求时间复杂度为O(n) 思路:根据二进制表示的前缀. 先求出最大数的位数,然后根据位数作位操作异或判断最大值.由于要求时间复杂度为O(n),在 ...

最新文章

  1. 39 JavaScript中的严格模式
  2. body里写注释 postman_HTTP Status 415 – Unsupported Media Type(使用@RequestBody后postman调接口报错)...
  3. IE6/7/8/9中Table/Select的innerHTML不能赋值
  4. 浅析高端网站建设策划方案都包括哪些内容?
  5. Java 三位数的变形
  6. 43. Multiply Strings 字符串相乘
  7. cocos creator 多张图片 椭圆运动_信阳液位测量图片
  8. python复制文件到指定文件夹_python 拷贝文件夹下所有的文件到指定文件夹(不包括目录)...
  9. 国威 416 电话交换机设置
  10. Mac 安装 TeamViewer 打开应用闪退
  11. 为什么OpenCV4 “pkg-config --modversion opencv”显示“ No package ‘opencv‘ found”?解决方法!
  12. hdu1827 1269 2767 强连通分支 刷水
  13. hibernate - mappedby的理解
  14. 股票软件破解常用破解工具介绍
  15. legacy引导gpt分区_UEFI+GPT、Legacy+MBR引导模式介绍 引导修复
  16. 编译报错:error: ro.build.fingerprint cannot exceed 91 bytes
  17. 克劳特法matlab,经验模式分解matlab
  18. 自学单片机编程(四)流水灯代码优化
  19. Codeforces #208 div2前两题及思维风暴
  20. 医学图像处理入门知识 | 格式DICOM,MHD+RAW | 坐标系 | ITK-SNAP | 重采样

热门文章

  1. java中处理字符编码(网页与数据库)(转)
  2. js防止客户端多触发
  3. HDU 5226 Tom and matrix(组合数学+Lucas定理)
  4. Statement对象重新执行将关闭当前ResultSet
  5. k-means-algorithm
  6. 3.放弃CHAR吧,在铸成大错之前!
  7. MYSQL 看书笔记
  8. 安装好的苹果系统部分截图
  9. 使用objectdatasource结合数据绑定控件进行简单三层架构的开发
  10. linux 安装tar 命令