Xor Sum(字典树加贪心)

liuyiding题解: 对输入的n个整数的二进制串建一棵字典树。然后对于每一个查询值x,在字典树中贪心查找,如果当前值的异或值存在,则走下去,,否则走另一边,这样查询的复杂度就为o(1)了.AC代码:#include <iostream>#include <cstring>#include <sstream>#include <cstdio>#include <cmath>#include <bitset>#include <map>#include <queue>#include <vector>#include <cstdlib>#include <algorithm>#define ls u << 1#define rs u << 1 | 1#define lson l, mid, u << 1#define rson mid + 1, r, u << 1 | 1#define INF 0x3f3f3f3f#define MAX 2using namespace std;typedef long long ll;typedef unsigned long long ull;const int M = 1e4 + 100;const int mod = 1e9 + 7;int a[40],maxn;struct Trie {int index;Trie *next[MAX];Trie() {index = 0;memset(next,0,sizeof(next));}};void Trie_insert(Trie *tr,int len) {if(len >= 0) {int u = a[len];if(tr->next[u] == 0) tr->next[u] = new Trie;Trie_insert(tr->next[u],len – 1);}}void dfs(Trie *tr,int len) {if(tr == NULL || len < 0) return;int u = a[len];if(tr->next[!u]) {maxn = maxn * 2 + !u;dfs(tr->next[!u],len – 1);} else {maxn = maxn * 2 + u;dfs(tr->next[u],len – 1);}}int main() {int T,n,m,cnt = 0;scanf("%d",&T);while(T–) {Trie *root = new Trie;scanf("%d %d",&n,&m);for(int i = 0; i < n; i++) {int x;scanf("%d",&x);memset(a,0,sizeof(a));for(int i = 0; x; i++) {a[i] = x & 1;x >>= 1;}Trie_insert(root,31);}printf("Case #%d:\n",++cnt);while(m–) {int x;maxn = 0;scanf("%d",&x);memset(a,0,sizeof(a));for(int i = 0; x; i++) {a[i] = x & 1;x >>= 1;}dfs(root,31);printf("%d\n",maxn);}}return 0;}

没有行李,没有背包,不带电脑更不要手机,

Xor Sum(字典树加贪心)

相关文章:

你感兴趣的文章:

标签云: