异或空间求基(模板)——hdu3949

输出样例有点问题的。。

#include<bits/stdc++.h>
using namespace std;
#define ll unsigned long long
#define maxn 10005
ll n,a[maxn],zero,size;

void gauss(){
    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;size=i-1;return;}
        
        for(int k=63;k>=0;k--)
            if(a[i] & (1ull<<k)){
                for(int j=1;j<=n;j++)
                    if(j!=i && (a[j] & (1ull<<k)))
                        a[j]^=a[i];
                break;//消完最高元后就可以退出了 
            }
    }
}

int main(){
    int t,tt;cin>>t;
    for(int tt=1;tt<=t;tt++){

        printf("Case #%d:\n",tt);
        
        cin>>n;        zero=0;size=n; 
        for(int i=1;i<=n;i++)cin>>a[i];
        gauss();
        
        int q;cin>>q;
        while(q--){
            ll k,ans=0;
            cin>>k;
            if(zero)k--;
            if(k>= (1llu<<size)){puts("-1");continue;}
            for(int i=size-1;i>=0;i--)
                if(k & (1llu<<i))
                        ans^=a[size-i];
            cout<<ans<<'\n';
        }
    }
}
 

 

posted on 2019-07-19 18:11  zsben  阅读(233)  评论(1编辑  收藏  举报

导航