首页 > 其他 > 详细

hdu4825 Xor Sum

时间:2017-11-30 19:58:31      阅读:224      评论:0      收藏:0      [点我收藏+]

找两个异或和最大的数
很容易想到trie树维护二进制

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
typedef long long ll;
struct Node{
    ll son[2], idd;
    bool hav[2];
    Node(){
        son[0] = son[1] = idd = hav[1] = hav[0] = false;
    }
}trie[3500005];
int T, n, m, cnt;
ll tmp;
void ins(ll uu, ll id){
    ll u=0;
    for(int i=32; i>=0; i--){
        ll ss=(uu&(1ll<<i))>0;
        if(!trie[u].hav[ss]){
            trie[u].hav[ss] = true;
            trie[u].son[ss] = ++cnt;
        }
        u = trie[u].son[ss];
    }
    trie[u].idd = id;
}
ll sol(ll uu){
    ll re=0, u=0;
    for(int i=32; i>=0; i--){
        ll ss=(uu&(1ll<<i))>0;
        if(ss){
            if(trie[u].hav[0])  u = trie[u].son[0];
            else                u = trie[u].son[1];
        }
        else{
            if(trie[u].hav[1])  re |= 1<<i, u = trie[u].son[1];
            else                u = trie[u].son[0];
        }
    }
    return trie[u].idd;
}
int main(){
    cin>>T;
    for(int ii=1; ii<=T; ii++){
        printf("Case #%d:\n", ii);
        cnt = 0;
        memset(trie, 0, sizeof(trie));
        scanf("%d %d", &n, &m);
        for(int i=1; i<=n; i++){
            scanf("%lld", &tmp);
            ins(tmp, tmp);
        }
        while(m--){
            scanf("%lld", &tmp);
            printf("%lld\n", sol(tmp));
        }
    }
    return 0;
}

hdu4825 Xor Sum

原文:http://www.cnblogs.com/poorpool/p/7930596.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!