• Xor Sum(hdu 4825)


    Xor Sum

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others)

    Total Submission(s): 3684    Accepted Submission(s): 1609

    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

    题解:trie

    将数转化成二进制形式,然后存放在字典树中,然后进行从高位到低位判断,让异或值尽可能为1

    即若某一位为p,则判断当前节点rt的next[!p]是否存在,存在则当前节点为rt->next[!p];否则为rt->next[p].

    代码如下:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    using namespace std;
    
    typedef long long ll;
    const int N=1e5+7;
    ll a[N];
    char str[40];
    struct Trie{
        Trie* next[2];
        int id;
    };
    Trie* build()
    {
        Trie* p=(Trie* )malloc(sizeof(Trie));
        p->id=0;
        p->next[0]=p->next[1]=NULL;
        return p;
    }
    void build_trie(Trie* root,char str[],int id)
    {
        Trie* rt=root;
        int i=0;
        while(str[i])
        {
            int id=str[i]-'0';
            if(!rt->next[id])
                rt->next[id]=build();
            rt=rt->next[id];
            i++;
        }
        rt->id=id;
    }
    int query(Trie* root,char str[])
    {
        int i=0;
        Trie* rt=root;
        while(str[i])
        {
            int id=str[i]-'0';
            if(rt->next[!id])
                rt=rt->next[!id];
            else
                rt=rt->next[id];
            i++;
        }
        return rt->id;
    }
    int main()
    {
        int t,n,m;
        ll num;
        scanf("%d",&t);
        for(int i=1;i<=t;i++)
        {
            scanf("%d%d",&n,&m);
            Trie* rt=build();
            for(int j=1;j<=n;j++)
            {
                scanf("%lld",&a[j]);
                num=a[j];
                for(int k=0;k<40;k++)
                    str[k]='0';
                int l=32;
                while(num)
                {
                    if(num&1)
                        str[l]=1+'0';
                    num>>=1;
                    l--;
                }
                str[33]='';
                build_trie(rt,str,j);
            }
            printf("Case #%d:
    ",i);
            while(m--)
            {
                scanf("%lld",&num);
                int l=32;
                for(int k=0;k<40;k++)
                    str[k]='0';
                while(num)
                {
                    if(num&1)
                        str[l]='1';
                    num>>=1;
                    l--;
                }
                str[33]='';
                printf("%lld
    ",a[query(rt,str)]);
            }
        }
        return 0;
    }
    View Code
  • 相关阅读:
    vue移动框架vonic
    vue桌面端框架element
    vuex最简单的入门文档
    Vuex最简单教程
    环境配置
    【转】MyEclipse8.5集成Tomcat7时的启动错误:Exception in thread “main” java.lang.NoClassDefFoundError org/apache/commons/logging/LogFactory
    Java中获取完整的url
    【转载】Android Studio 设置内存大小及原理
    Android上实现仿IOS弹性ScrollView
    ServletContextListener 启动SPRING加载数据到缓存的应用
  • 原文地址:https://www.cnblogs.com/lemon-jade/p/8496687.html
Copyright © 2020-2023  润新知