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; }