CF1101G (Zero XOR Subset)-less

题目地址:洛谷

线性基基础题

预处理一个前缀异或和 \(s_i\)

这样题目就变成了:在 \(n\)\(s_i\) 中尽量选择多的数使选择的数产生的任意子集的异或和不为 \(0\) ,其中必须要选 \(s_n\)

如果 \(s_n=0\) ,则无解,输出 \(-1\)

否则,贪心,能选尽量选

代码:

#include <bits/stdc++.h>
using namespace std;
const int N = 200006;
int n, a[N], s[N], b[31];

bool work(int x) {
    for (int i = 30; i >= 0; i--)
        if ((x >> i) & 1) {
            if (!b[i]) {
                b[i] = x;
                return 1;
            }
            x ^= b[i];
        }
    return 0;
}

int main() {
    cin >> n;
    for (int i = 1; i <= n; i++) {
        scanf("%d", &a[i]);
        s[i] = s[i-1] ^ a[i];
    }
    if (!s[n]) {
        puts("-1");
        return 0;
    }
    int ans = 0;
    for (int i = n; i; i--)
        if (work(a[i])) ++ans;
    cout << ans << endl;
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/xht37/p/10263435.html
xor