#CF1971G. 异或交换(XOUR)

异或交换(XOUR)

异或交换(XOUR)

时间限制:2s
空间限制:256MB

题目描述

给定一个由 nn 个非负整数组成的数组 aa。

当且仅当 aiXORaj<4a_i\mathbin{\mathsf{XOR}}a_j<4 时,你可以交换位置 ii 和 jj 上的元素,其中 XOR\mathsf{XOR} 表示按位异或运算。

请找出经过任意次数的合法交换后,能够得到的字典序最小的数组。

对于两个不同的等长数组 xx 和 yy,设 ii 是它们第一个不同的位置。如果 xi<yix_i<y_i,则称数组 xx 的字典序小于数组 yy。

输入格式

第一行包含一个整数 tt,表示测试用例的数量。

每个测试用例的第一行包含一个整数 nn,表示数组的长度。

每个测试用例的第二行包含 nn 个整数 a1,a2,…,ana_1,a_2,\ldots,a_n,表示数组的元素。

输出格式

对于每个测试用例,输出一行 nn 个整数,表示能够得到的字典序最小的数组。

样例输入 1

4
4
1 0 3 2
5
2 7 1 5 6
8
1 2 1 2 1 2 1 2
4
16 4 1 64

样例输出 1

0 1 2 3 
1 5 2 6 7 
1 1 1 1 2 2 2 2 
16 4 1 64

样例解释

对于第一个测试用例,可以交换任意两个元素,因此可以得到升序排列的数组。

对于第二个测试用例,可以交换 22 和 11、77 和 55、77 和 66。这三对数的异或值依次为 33、22、11,从而得到所求数组。

数据范围

  • 对于所有数据,满足 1≤t≤1041\le t\le 10^4。
  • 对于所有数据,满足 1≤n≤2⋅1051\le n\le 2\cdot10^5。
  • 对于所有数据,满足 0≤ai≤1090\le a_i\le 10^9。
  • 所有测试组共同满足 ∑n≤2⋅105\sum n\le 2\cdot10^5。
子任务编号 分值 特殊限制
1 15 n≤7n\le 7,且一个输入文件内的 ∑n≤35\sum n\le 35
2 25 n≤2000n\le 2000,且一个输入文件内的 ∑n≤4000\sum n\le 4000
3 30 所有元素均满足 ai≤4095a_i\le 4095
4 无特殊限制