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

  1. 2
  2. 3 2
  3. 3 4 5
  4. 1
  5. 5
  6. 4 1
  7. 4 6 5 6
  8. 3

Sample Output

  1. Case #1:
  2. 4
  3. 3
  4. Case #2:
  5. 4

题意:

给出n个数a[],然后给出m个问题Y,求a[]里面的X,有X xor Y最大。

字典树的作用之一----最大异或:

如果找一个数的最大异或,当然需要从高位到低位(已转化为二进制),尽可能不同。

  • 那么我们从高位到低位表示一个数X,并且存入字典树中,结尾节点记录X(不同的数结尾肯定不同)。
  • 对于询问,从高位到地位先尽可能从兄弟边走。

这可Trie树高度为32,复杂度在接受范围内。

  1. #include<cstdio>
  2. #include<cstdlib>
  3. #include<iostream>
  4. #include<cmath>
  5. #include<algorithm>
  6. #include<cstring>
  7. using namespace std;
  8. const int maxn=;
  9. inline int read()
  10. {
  11. int res=;char x=getchar();while(x<''||x>'') x=getchar();
  12. while(x>=''&&x<=''){ res=res*+x-'';x=getchar();}return res;
  13. }
  14. int q_pow(int a,int x){ int res=;while(x){ if(x&) res*=a; x>>=; a=a*a;} return res; }
  15. struct TREE
  16. {
  17. int ch[maxn][],cnt,num[maxn];
  18. void init() { memset(ch,,sizeof(ch));cnt=;}
  19. void insert(int s[],int val)
  20. {
  21. int Now=;
  22. for(int i=;i>=;i--){
  23. if(!ch[Now][s[i]]) ch[Now][s[i]]=++cnt;
  24. Now=ch[Now][s[i]];
  25. } num[Now]=val;
  26. }
  27. int query(int s[])
  28. {
  29. int Now=;
  30. for(int i=;i>=;i--){
  31. if(ch[Now][s[i]^]) Now=ch[Now][s[i]^];
  32. else Now=ch[Now][s[i]];
  33. } return num[Now];
  34. }
  35. }Tree;
  36. int main()
  37. {
  38. int T,n,m,x,tx,a[],Case=;
  39. scanf("%d",&T);
  40. while(T--){
  41. printf("Case #%d:\n",++Case);
  42. scanf("%d%d",&n,&m);
  43. Tree.init();
  44. for(int i=;i<=n;i++){
  45. scanf("%d",&x);tx=x;
  46. for(int j=;j<=;j++) {
  47. a[j]=x%; x>>=;
  48. } Tree.insert(a,tx);
  49. }
  50. for(int i=;i<=m;i++) {
  51. scanf("%d",&x);
  52. for(int j=;j<=;j++) {
  53. a[j]=x%; x>>=;
  54. } printf("%d\n",Tree.query(a));
  55. }
  56. }return ;
  57. }

兄弟题目:Find MaxXorSum ,这个题求最大异或结果。

所以不需要记录来自于那个数字,记录下和即可。

  1. #include<cstdio>
  2. #include<cstdlib>
  3. #include<iostream>
  4. #include<cmath>
  5. #include<algorithm>
  6. #include<cstring>
  7. using namespace std;
  8. const int maxn=;
  9. inline int read()
  10. {
  11. int res=;char x=getchar();while(x<''||x>'') x=getchar();
  12. while(x>=''&&x<=''){ res=res*+x-'';x=getchar();}return res;
  13. }
  14. int q_pow(int a,int x){ int res=;while(x){ if(x&) res*=a; x>>=; a=a*a;} return res; }
  15. struct TREE
  16. {
  17. int ch[maxn][],cnt;
  18. void init() { memset(ch,,sizeof(ch));cnt=;}
  19. void insert(int s[])
  20. {
  21. int Now=;
  22. for(int i=;i>=;i--){
  23. if(!ch[Now][s[i]]) ch[Now][s[i]]=++cnt;
  24. Now=ch[Now][s[i]];
  25. }
  26. }
  27. int query(int s[])
  28. {
  29. int Now=,res=;
  30. for(int i=;i>=;i--){
  31. if(ch[Now][s[i]^]) Now=ch[Now][s[i]^],res+=q_pow(,i);
  32. else if(ch[Now][s[i]]) Now=ch[Now][s[i]];
  33. else break;
  34. } return res;
  35. }
  36. }Tree;
  37. int main()
  38. {
  39. int T,n,i,j,a[],b[],tmp,ans;
  40. scanf("%d",&T);
  41. while(T--){
  42. Tree.init(); ans=; scanf("%d",&n);
  43. for(i=;i<=n;i++){
  44. scanf("%d",&a[i]); tmp=a[i];
  45. for(j=;j<=;j++) {
  46. b[j]=tmp%; tmp>>=;
  47. } Tree.insert(b);
  48. }
  49. for(i=;i<=n;i++) {
  50. for(j=;j<=;j++) {
  51. b[j]=a[i]%; a[i]>>=;
  52. } ans=max(ans,Tree.query(b));
  53. } printf("%d\n",ans);
  54. }return ;
  55. }

HDU4825 Xor Sum(字典树解决最大异或问题)的更多相关文章

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

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

  2. HDU4825 Xor Sum —— Trie树

    题目链接:https://vjudge.net/problem/HDU-4825 Xor Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Li ...

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

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

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

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

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

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

  6. AcWing:143. 最大异或对(01字典树 + 位运算 + 异或性质)

    在给定的N个整数A1,A2……ANA1,A2……AN中选出两个进行xor(异或)运算,得到的结果最大是多少? 输入格式 第一行输入一个整数N. 第二行输入N个整数A1A1-ANAN. 输出格式 输出一 ...

  7. HDU-4825 Xor Sum,字典树好题!

    Xor Sum 一遍A了之后大呼一声好(keng)题!debug了两小时~~~~百度之星资格赛,可以. 题意:给你一个n个元素的数组,m次查询,每次输入一个数k要求从数组中找到一个数与k异或值最大,输 ...

  8. ☆ [HDU4825] Xor Sum「最大异或和(Trie树)」

    传送门:>Here< 题意:给出一个集合,包含N个数,每次询问给出一个数x,问x与集合中的一个数y异或得到最大值时,y是多少? 解题思路 由于N,M非常大,暴力显然不行.抓住重点是异或,所 ...

  9. [Hdu4825]Xor Sum(01字典树)

    Description Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包含了N个正整数,随后 Prometheus 将向 Zeus 发起M次询问 ...

随机推荐

  1. NHibernate剖析:Mapping篇之Mapping-By-Code(1):概览

    ModelMapper概述 NHibernate3.2版本号集成Mapping-By-Code(代码映射),其设计思想来源于ConfORM.代码总体构思基于"Loquacious" ...

  2. MySQL双主热备问题处理

    1. Slave_IO_Running: No mysql> show slave status\G *************************** 1. row *********** ...

  3. Linux基础(1)- 命令和目录文件

    1.开启Linux操作系统,要求以root用户登录GNOME图形界面,语言支持选择为汉语 Linux操作界面如图: 右击桌面,点击打开终端 输入“su”,点击回车键,出现密码,输入密码,点击回车键,显 ...

  4. 第14章8节《MonkeyRunner源代码剖析》 HierarchyViewer实现原理-获取控件列表并建立控件树

    在上几节的描写叙述中,我们把HierarchyViewer初始化好.也把ViewServer给装备好了.那如今距离获得一个控件去操作它是万事具备仅仅欠东风了,欠了那一股春风了?欠了的是建立控件树这个东 ...

  5. bat+sqlcmd 批量执行脚本

    Hello,此BAT脚本能够帮助开发者将某目录下全部SQL脚本按文件名称依次在指定数据库中批量执行. 不用忍受powershell invoke-sqlcmd 的笨重.在指执行时多一种选择. bat文 ...

  6. oracle sql修改序列为当前序列开始

    declare   v_num integer;  last_value integer;Begin  select SEQ_TBM_ID.NEXTVAL into last_value from d ...

  7. Cisco策略路由(policy route)精解(转载)

    原文:http://www.guanwei.org/post/Cisconetwork/07/Cisco-policy-route_8621.html 注:PBR以前是CISCO用来丢弃报文的一个主要 ...

  8. SQL还有多少"理所当然";还有那些"就是这样"

    前言废话——sql是程序员的饭碗,繁琐but万能,但能干并不意味着适合干,每当多表关联寻找外键时,我都在经历一种没有选择的痛苦.sql不完美,但长期代码让人无暇顾及完美,再痛苦的呐喊到最后都归于疲倦已 ...

  9. iOS开发之NewsstandKit.framework的使用

    本文转载至 http://mobile.51cto.com/iphone-423385.htm   系统提供NewsstandKit.framework来支持newsstand类型的程序,就是在spr ...

  10. 【BZOJ2625】[Neerc2009]Inspection 最小流

    [BZOJ2625][Neerc2009]Inspection Description You are in charge of a team that inspects a new ski reso ...