1 求n个数的异或最大值
void get(ll x)
{
for(int i = Base;i >= 0;i--)
{
if(x>>(ll)i&1)
{
if(b[i]) x ^= b[i];
else
{
b[i] = x;
break;
}
}
}
}
2 区间异或第k小
vector<ll> v;
void get(ll x)
{
for(int i = Base;i >= 0;i--)
{
if((x>>(ll)i)&1)
{
if(b[i]) x ^= b[i];
else
{
b[i] = x;
for(int j = i - 1;j >= 0;j--)
{
if(b[j]&&(b[i]>>j&1)) b[i] ^= b[j];
}
for(int j = i + 1;j <= Base;j++)
{
if(b[j]>>i&1) b[j] ^= b[i];
}
return ;
}
}
}
}
ll query(ll k)
{
int len = v.size();
if(len != n) k--;
if(k > (1LL<<len)-1) return -1;
ll ans = 0;
for(int i = 0;i < len;i++)
{
if(k&(1LL<<i))
{
ans = ans ^ b[i];
}
}
return ans;
}