【HDU 3949】 XOR|線性基
阿新 • • 發佈:2019-02-07
忘記把除錯資訊去掉 不是第一次犯這種情況啦。。。。
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define LL long long const int MAXN = 10000+10; LL f[MAXN]; int n,m,tot,ok; void gauss() { tot=0;ok=0; for(LL i=(1ll<<62);i>=1;i>>=1) { bool is=false; for(int j=tot+1;j<=n;j++) if( (f[j]&i)!=0ll) { is=true; swap(f[j],f[++tot]); break; } if(is) for(int j=1;j<=n;j++) if(j!=tot && (f[j]&i)!=0ll) f[j]^=f[tot]; } if(n!=tot) ok=1; } LL q(LL x) { x-=ok; if(x==0) return 0; if(x>=(1ll<<tot)) return -1ll; LL ans=0; for(int i=0;i<tot;i++) if(x&(1ll<<i)) ans^=f[tot-i]; return ans; } int main() { int T;cin>>T; for(int i=1;i<=T;i++) { printf("Case #%d:\n",i); scanf("%d",&n); for(int j=1;j<=n;j++) scanf("%lld",&f[j]); gauss(); scanf("%d",&m); for(int j=1;j<=m;j++) { LL x;scanf("%lld",&x); printf("%lld\n",q(x)); } } return 0; }