1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
| #include <bits/stdc++.h> using namespace std;
const int N = 1e5 + 10;
struct Trie { int root, sz, cnt[N * 31], nxt[N * 31][2]; int newnode() { cnt[sz] = 0; memset(nxt[sz], 0, sizeof(nxt[sz])); return sz++; } void init() { sz = 0; root = newnode(); } void insert(int x) { int p = root; for(int i = 29; ~i; --i) { int c = (x >> i) & 1; if(!nxt[p][c]) nxt[p][c] = newnode(); p = nxt[p][c]; cnt[p]++; } } }A, B;
int a[N], b[N], T, n;
vector< pair<int, int> > ans;
void dfs(int p1, int p2, int x, int s) { int c = min(A.cnt[p1], B.cnt[p2]); A.cnt[p1] -= c; B.cnt[p2] -= c; if(s == 30) { ans.push_back(make_pair(x, c)); return; } if(A.cnt[A.nxt[p1][0]] && B.cnt[B.nxt[p2][0]]) dfs(A.nxt[p1][0], B.nxt[p2][0], x << 1, s + 1); if(A.cnt[A.nxt[p1][1]] && B.cnt[B.nxt[p2][1]]) dfs(A.nxt[p1][1], B.nxt[p2][1], x << 1, s + 1); if(A.cnt[A.nxt[p1][0]] && B.cnt[B.nxt[p2][1]]) dfs(A.nxt[p1][0], B.nxt[p2][1], x << 1 | 1, s + 1); if(A.cnt[A.nxt[p1][1]] && B.cnt[B.nxt[p2][0]]) dfs(A.nxt[p1][1], B.nxt[p2][0], x << 1 | 1, s + 1); }
int main() { scanf("%d", &T); while(T--) { scanf("%d", &n); A.init(); B.init(); for(int i = 1; i <= n; ++i) { scanf("%d", &a[i]); A.insert(a[i]); } for(int i = 1; i <= n; ++i) { scanf("%d", &b[i]); B.insert(b[i]); } ans.clear(); dfs(A.root, B.root, 0, 0); sort(ans.begin(), ans.end()); for(int i = 0; i < ans.size(); ++i) { for(int j = 1; j <= ans[i].second; ++j) { printf("%d", ans[i].first); if(j != ans[i].second) printf(" "); } if(i + 1 != ans.size()) printf(" "); } puts(""); } return 0; }
|