【LOJ】#114. k 大異或和 -線性基&貪心
阿新 • • 發佈:2018-11-26
傳送門:loj114
題解
注意構造的線性基 需要滿足:若第 位上都有值,則 且 ,這樣從高位到低位貪心才滿足只決策了當前位。
需要特判非空子集中是否存在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;
}