HDU 3494 xor (线性基求第k小)

在这里插入图片描述
参考代码:

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <vector>
#include <map>
#include <queue>
#include <set>
#include <ctime>
#include <cstring>
#include <cstdlib>
#include <math.h>
using namespace std;
typedef long long ll;
const int N = 1005;
const int maxn = 1e6 + 5;
ll bas[65], cnt;
void ins(ll x)
{
    for (ll i = 60; ~i; i--)
    {
        if ((x >> i) & 1)
        {
            if (!bas[i])
            {
                cnt++;
                bas[i] = x;
                for (ll j = i - 1ll; j >= 0; j--)
                    if (((bas[i] >> j) & 1))
                        bas[i] ^= bas[j];
                for (ll j = i + 1; j <= 60; j++)
                    if ((bas[j] >> i) & 1ll)
                        bas[j] ^= bas[i];
                break;
            }
            else
                x ^= bas[i];
        }
    }
}
ll q[maxn], ql;
void push()
{
    ql = 0;
    for (ll i = 0; i < 61; i++)
        if (bas[i])
            q[ql++] = bas[i];
}
ll query(ll k, ll n)
{
    if (cnt != n)
        k--;
    if (k >= ((1ll << ql)))
        return -1;
    ll ans = 0;
    for (ll i = 0; i < ql; i++)
        if ((k >> i) & 1)
            ans ^= q[i];
    return ans;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    ll n, t, x;
    cin >> t;
    for (ll m = 1; m <= t; m++)
    {
        memset(bas, 0, sizeof bas);
        cnt = 0;
        cin >> n;
        for (ll i = 0; i < n; i++)
            cin >> x, ins(x);
        push();
        ll Q;
        cout << "Case #" << m << ':' << endl;
        cin >> Q;
        while (Q--)
        {
            cin >> x;
            cout << query(x, n) << endl;
        }
    }
}

猜你喜欢

转载自blog.csdn.net/yangzijiangac/article/details/107412728