0
点赞
收藏
分享

微信扫一扫

210. 异或运算

编程练习生J 2022-02-13 阅读 64

Link
线性基板子,求一个数列可以得到的第 k k k 小异或值。

int t = 0;
int n;
vector<ull> b;
void insert(ull x) {
    for(auto i : b)
        x = min(x, x ^ i);
    for(auto& i : b)
        i = min(i, x ^ i);
    if(x)
        b.pb(x);
}
void solve() {
    printf("Case #%d:\n", ++t);
    cin >> n;
    b.clear();
    for(int i = 1; i <= n; i++) {
        ull x;
        cin >> x;
        insert(x);
    }
    int q;
    cin >> q;
    sort(b.begin(), b.end());
    for(int i = 1; i <= q; i++) {
        ull k;
        cin >> k;
        if(b.size() < n) k--;
        ull ans = 0;
        for(auto i : b) {
            if(k & 1) ans ^= i;
            k >>= 1;
        }
        if(k == 0) {
            cout << ans << endl;
        }
        else {
            cout << -1 << endl;
        }
    }
}
举报

相关推荐

0 条评论