MENU

LibreOJ#6087 毒瘤题

LibreOJ#6087

若$k=1$,直接输出所有数异或和$ans$。

否则,$k=2$,对于二进制位维护$a_i$,若当前数第$i$位为$1$,将$a_i$异或上该数。如果$ans$中第$i$位是$1$,说明答案中有一个数该位是$1$,那么$a_i$就是其中一个数,异或$ans$即为另一个数。

#include<cstdio>
int n, k, ans, bit[32];
int main() {
    scanf("%d%d", &n, &k);
    for(int i = 0; i < n; ++i) {
        int t;
        scanf("%d", &t), ans ^= t;
        for(int j = 0; j < 32; ++j)if(t & 1 << j)bit[j] ^= t;
    }
    if(k == 1)return printf("%d", ans), 0;
    for(int i = 0; i < 32; ++i)if(ans & 1 << i) {
            int x = bit[i], y = ans ^ bit[i];
            if(x > y) {
                int t = x;
                x = y, y = t;
            }
            return printf("%d %d", x, y), 0;
        }
}
Leave a Comment

captcha
请输入验证码