• HDU4825(01字典树)


    Xor Sum

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others)
    Total Submission(s): 2920    Accepted Submission(s): 1264


    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
     

    Source

     
    按照集合里每个数的二进制建立01字典树,询问时,要想结果最大,走树上反着的那条边。
     1 //2017-09-16
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <iostream>
     5 #include <algorithm>
     6 
     7 using namespace std;
     8 
     9 const int N = 110000;
    10 
    11 int n, m;
    12 int trie[32*N][2], value[32*N], tot;
    13 
    14 void init(){
    15     tot = 1;
    16     memset(trie[0], 0, sizeof(trie[0]));
    17 }
    18 
    19 void insert(int x){
    20     int cur = 0;
    21     for(int i = 31; i >= 0; i--){
    22         int idx = ((x>>i)&1);
    23         if(!trie[cur][idx]){
    24             memset(trie[tot], 0, sizeof(trie[tot]));
    25             value[tot] = 0;
    26             trie[cur][idx] = tot++;
    27         }
    28         cur = trie[cur][idx];
    29     }
    30     value[cur] = x;
    31 }
    32 
    33 int query(int x){
    34     int cur = 0;
    35     for(int i = 31; i >= 0; i--){
    36         int idx = ((x>>i)&1);
    37         if(trie[cur][idx^1]) cur = trie[cur][idx^1];
    38         else cur = trie[cur][idx];
    39     }
    40     return value[cur];
    41 }
    42 
    43 int main()
    44 {
    45     int T, kase = 0;
    46     scanf("%d", &T);
    47     while(T--){
    48         scanf("%d%d", &n, &m);
    49         init();
    50         int x;
    51         for(int i = 1; i <= n; i++){
    52             scanf("%d", &x);
    53             insert(x);
    54         }
    55         printf("Case #%d:
    ", ++kase);
    56         while(m--){
    57             scanf("%d", &x);
    58             printf("%d
    ", query(x));
    59         }
    60     }
    61 
    62     return 0;
    63 }
  • 相关阅读:
    【GruntMate】一个让你更方便使用Grunt的工具
    HTML5小游戏【是男人就下一百层】UI美化版
    【Grunt】关于Grunt可视化的尝试
    在腾讯ubuntu云服务器上面部署asp.net core 2.1网站
    存储过程中执行动态Sql语句
    我的2016年总结
    程序员的成长阶梯和级别定义
    让IE8在win7下面能显示使用window.showmodaldialog弹出窗口的地址状态栏
    更改计算机名称后 导致 sql server 2008 R2 用windows账户不能附加的错误解决办法
    【转】通过js获取系统版本以及浏览器版本
  • 原文地址:https://www.cnblogs.com/Penn000/p/7532501.html
Copyright © 2020-2023  润新知