ACdream1063——平衡树

来源:互联网 发布:阿里云主机和云服务器 编辑:程序博客网 时间:2024/05/21 19:33
1、题目大意:让你设计一种数据结构,支持插入一个数,和在这个结构里查询结构中的哪个数和给定的数的异或值最小
2、分析:这个怎么做呢,就是trie树,我们建立一个trie树,把树按01进制存进去,然后在查询的时候,

我们就贪心的在trie树的一直走

#include <cstdio>#include <cstdlib>#include <cstring>#include <algorithm>using namespace std;struct Trie{    int ch[1000000][3];    int num;    inline void insert(int k){        int u = 0;        for(int i = 30; i >= 0; i --){            int s = ((1 << i) & k);            if(s){                if(!ch[u][1]){                    num ++;                    ch[u][1] = num;                 }                u = ch[u][1];            }            else{                if(!ch[u][0]){                    num ++;                    ch[u][0] = num;                }                u = ch[u][0];            }        }        return;    }    inline int qmin(int k){        int u = 0;        int ret = 0;        for(int i = 30; i >= 0; i --){            int s = ((1 << i) & k);            if(s) {                if(ch[u][1]){                    u = ch[u][1];                    ret += (1 << i);                }                else{                    u = ch[u][0];                }            }            else{                if(ch[u][0]){                    u = ch[u][0];                }                else{                    u = ch[u][1];                    ret += (1 << i);                }            }        }        return ret;    }    inline int qmax(int k){        int u = 0;        int ret = 0;        for(int i = 30; i >= 0; i --){            int s = ((1 << i) & k);            if(s) {                if(ch[u][0]){                    u = ch[u][0];                }                else{                    u = ch[u][1];                    ret += (1 << i);                }            }            else{                if(ch[u][1]){                    u = ch[u][1];                    ret += (1 << i);                }                else{                    u = ch[u][0];                }            }        }        return ret;    }} wt;int main(){    int T;    scanf("%d", &T);    while(T --){        memset(wt.ch, 0, sizeof(wt.ch));        wt.num = 0;        int n;        scanf("%d", &n);        char str[10];        int k;        for(int i = 1; i <= n; i ++){            scanf("%s", str);            scanf("%d", &k);            if(str[2] == 's'){                wt.insert(k);             }            else if(str[2] == 'i'){                int ans = wt.qmin(k);                printf("%d\n", ans^k);            }            else {                int ans = wt.qmax(k);                printf("%d\n", ans^k);;            }        }    }    return 0;} 


0 0
原创粉丝点击