【LOJ】#114. k 大異或和 -線性基&貪心
阿新 • • 發佈:2018-12-22
題解
注意構造的線性基需要滿足:若第位上都有值,則且,這樣從高位到低位貪心才滿足只決策了當前位。
需要特判非空子集中是否存在0
程式碼
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=1e5+10; int n,m,cnt; ll bin[55],a[N],q,ans; inline void ins(ll x) { int i,j; for(i=50;(~i)&&x;--i) if(x&bin[i]){ if(!a[i]){ cnt++;a[i]=x; for(j=i-1;~j;--j) if(a[i]&bin[j]) a[i]^=a[j]; for(j=i+1;j<=50;++j) if(a[j]&bin[i]) a[j]^=a[i]; break; } x^=a[i]; } } inline ll sol(ll x) { if(x>bin[cnt]) return -1LL; if(cnt==n) x++;// ans=0LL;int i,re=cnt-1; for(i=50;~i;--i) if(a[i]){ if(x>bin[re]){ans^=a[i];x-=bin[re];} re--; } return ans; } int main(){ int i,j;ll x; bin[0]=1LL;for(i=1;i<=51;++i) bin[i]=bin[i-1]<<1; scanf("%d",&n); for(i=1;i<=n;++i) {scanf("%lld",&x);ins(x);} for(scanf("%d",&m);m;--m){ scanf("%lld",&q); printf("%lld\n",sol(q)); } return 0; }