码迷,mamicode.com
首页 > 其他好文 > 详细

hdu4825 Xor Sum

时间:2017-11-30 20:12:37      阅读:190      评论:0      收藏:0      [点我收藏+]

标签:while   pre   ios   最大   print   ring   namespace   size   name   

找两个异或和最大的数
很容易想到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

标签:while   pre   ios   最大   print   ring   namespace   size   name   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!