HDU 4825 Xor Sum(01字典树)

来源:互联网 发布:程序员客栈 36kr 编辑:程序博客网 时间:2024/06/03 21:47

题意:找出一个与给你的数字 异或最大的数字

思路;建立0.1 字典树,在找的时候找二进制想法的位置

#include <stdio.h>#include <algorithm>#include <cstring>#include <bitset>using namespace std;const int N=33;struct node{    node *nxt[2];    int val;    node()    {        val=0;        fill(nxt,nxt+2,nullptr);    }};node *root;void update(int n){    bitset<N> bit=n;    int num;    node *cur=root;    for (int i=32; i>=0; --i)    {        num=bit[i];        if(!cur->nxt[num])        {            node *tmp=new node();            cur->nxt[num]=tmp;            cur=tmp;        }        else            cur=cur->nxt[num];    }    cur->val=n; //最后记录当前数字是多少}int query(int k){    bitset<N> bit=k;    node *cur=root;    int num;    for (int i=32; i>=0; --i)    {        num=bit[i];        if(cur->nxt[num^1])  //因为要尽可能的大所以取相反的数字            cur=cur->nxt[num^1];        else            cur=cur->nxt[num];// 如果没有相反的就只能走下去了    }    return cur->val;}void desinfo(node *cur) //删除字典树释放内存{    for (int i=0; i<2; ++i)        if(cur->nxt[i])            desinfo(cur->nxt[i]);    delete cur;}int main(){    int T,val,s;    int n,m;    scanf("%d",&T);    for (int q=1; q<=T; ++q)    {        root =new node();        scanf("%d%d",&n,&m);        for (int i=0; i<n; ++i)        {            scanf("%d",&val);            update(val);        }        printf("Case #%d:\n",q);        for (int i=0; i<m; ++i)        {            scanf("%d",&s);            printf("%d\n",query(s));        }        desinfo(root);    }    return 0;}