#z1084. 档案层级(archive)

    ID: 1310 传统题 文件IO:archive 1000ms 512MiB 尝试: 1 已通过: 1 难度: 10 上传者: 标签>2026 核桃编程 csp-s 模拟赛

档案层级(archive)

题目描述

档案库中有 nn 份档案,第 ii 份档案的标签是一个可以用至多 ww 位二进制表示的非负整数 aia_i。不同档案的标签可以相同。

你需要选出恰好 kk 个无序下标对 (i,j)(i,j)。每个下标至多出现在一个下标对中,且每个下标对满足 1≤i<j≤n1\le i<j\le n。

对于一个下标对 (i,j)(i,j),记 d=ai⊕ajd=a_i\oplus a_j,其中 ⊕\oplus 表示按位异或。它的层级定义如下:

  • 若 d=0d=0,层级为 00;
  • 否则,层级为唯一满足 2t−1≤d<2t2^{t-1}\le d<2^t 的整数 tt。此时 1≤t≤w1\le t\le w。

对于一个配对方案,令 ctc_t 表示层级为 tt 的下标对数量,称

(cw,cw−1,…,c0)(c_w,c_{w-1},\ldots,c_0)

为这个方案的层级序列。

两个层级序列从左到右比较:在第一个不同的位置上,数值较大的序列更优。请计算所有合法配对方案中最优的层级序列。

输入格式

从文件 archive.in 中读取数据。

第一行输入三个整数 n,k,wn,k,w。

第二行输入 nn 个整数 a1,a2,…,ana_1,a_2,\ldots,a_n。

输出格式

输出到文件 archive.out 中。

输出 w+1w+1 个整数 cw,cw−1,…,c0c_w,c_{w-1},\ldots,c_0,表示最优的层级序列。

样例

10 5 3
0 1 4 4 5 6 6 7 7 7
2 3 0 0

样例解释

样例 #1 中,可以选择下标对 (1,6),(2,8),(3,7),(4,9),(5,10)(1,6),(2,8),(3,7),(4,9),(5,10)。

前两个下标对的标签异或值均为 66,层级为 33;后三个下标对的标签异或值分别为 2,3,22,3,2,层级均为 22,所以得到层级序列 (2,3,0,0)(2,3,0,0)。

层级为 33 的下标对必须由最高二进制位不同的两个标签组成。输入中只有两个标签的最高位为 00,因此不可能得到超过两个层级为 33 的下标对。其余三对的层级至多为 22,上述方案达到了这个上限。

数据规模与约定

对于所有数据,保证:

  • 2≤n≤2×1052\le n\le 2\times 10^5;
  • 1≤k≤⌊n2⌋1\le k\le \left\lfloor\dfrac n2\right\rfloor;
  • 1≤w≤301\le w\le 30;
  • 0≤ai<2w0\le a_i<2^w,其中 1≤i≤n1\le i\le n。

本题采用子任务捆绑计分:只有通过一个子任务的全部测试点,才能获得该子任务的分数。

子任务编号 分值 约束
11 1515 n≤12n\le 12
22 2020 k=1k=1
33 2525 w≤10w\le 10
44 4040 无特殊限制

大样例下载