HDU 6625 (01字典树)
题意: 给定两个长为n的数组a和b; 重新排列a和b,生成数组c,c[i]=a[i] xor b[i]; 输出字典序最小的c数组。 分析: 将a中的数插入一颗01字典树a中; 将b中的数插入一颗01字典树b中; 在trie树上查找n次,每次同时在a和b中下移一层; if 能同时走0,则同时走0; else if 能同时走1,则同时走1; else if 树a能走0&&树b能走1,则a走0、b走1; else if 树a能走1&&树b能走0,则a走1、b走0; else 向c中插入一个新数为这两个节点的异或值; 最后对c排序。 复杂度O(T*n*30) #include<bits/stdc++.h> using namespace std; const int maxn = 1e6+5; typedef long long LL; struct Trie01{ int ch[35 * maxn][2]; int cnt[35*maxn]; int node_cnt; inline void init(){ node_cnt = 1; memset(ch[0],0,sizeof(ch[0])); } inline void Insert(LL x){ int cur = 0; for(int i = 30;i >= 0;--i){ int idx = (x >> i) & 1; if(