异或空间

题目链接

https://www.acwing.com/problem/content/212/

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
const int p=1e9+7;
const int N=10100;
ull a[N];
int main()
{
    int T,n,t,m,kase=0;
    cin>>T;
    while(T--)
    {
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            cin>>a[i];    
        }
        bool zero=0;
        t=n;
        for(int i=1;i<=n;i++)
        {
            for(int j=i+1;j<=n;j++)
                if(a[j]>a[i])
                    swap(a[i],a[j]);
                if(a[i]==0)
                {
                    zero=1,t=i-1;break;
                }
                for(int k=63;k>=0;k--)
                {
                    if(a[i]>>k&1)
                    {
                        for(int j=1;j<=n;j++)
                        {
                            if(i!=j&&(a[j]>>k&1))
                                a[j]^=a[i];
                        }
                        break;
                    }
                }
        }
        cin>>m;    
        printf("Case #%d:\n",++kase);
        while(m--)
        {
            ull k,ans=0;
            cin>>k;
            if(zero)
                k--;
            if(k>=(1llu<<t))
                puts("-1");
            else
            {
                for(int i=t-1;i>=0;i--)
                {
                    if(k>>i&1)
                        ans^=a[t-i];
                }
                cout<<ans<<"\n";
            }
        }
    }
    return 0;
}

 

posted @ 2019-10-12 14:42  hh13579  阅读(200)  评论(0编辑  收藏  举报