非常简单的一个套路。
首先考虑求前缀异或和转化问题,即异或前 k 大的数对。
首先枚举数对的第二个数 r=1,2,…,n,并求出 [0,r) 内和 r 异或最大的数,根据异或值丢进优先队列。
然后执行 k 次,每次取出一个数,加入答案;
然后求同一个 r,[0,r) 与其异或中除了之前的值以外最大的数,丢进优先队列。
具体地说,就是同时在优先队列上维护一个排名 rk,表示这个候选项是同一个 r 中的异或第 rk 大。
初始时 rk=1,途中找到加入答案后就令 rk←rk+1。
代码:
1 |
|