线性基模板
存个板子
typedef long long ll;
struct base
{
ll a[63];
vector<ll> p;
bool flag;//标记答案集合中是否有0
base()
{
fill(a, a + 63, 0ll);
flag = false;
}
void init()
{
fill(a, a + 63, 0ll);
p.clear();
flag = false;
}
bool insert(ll val)
{
ll t = 1ll << 62;
for (int i = 62; ~i; --i)
{
if (val & t)
{
if (!a[i])
{
a[i] = val;
return true;
}
val ^= a[i];
}
t >>= 1;
}
flag = true;//能到这里说明能异或出0
return false;
}
ll query_max()
{
ll ans = 0;
for (int i = 62; ~i; --i)
if ((ans ^ a[i]) > ans)
ans ^= a[i];
return ans;
}
ll query_min()
{
for (int i = 0; i <= 62; ++i)
{
if (a[i])
return a[i];
}
return 0;
}
void rebuild()
{
ll t;
for (int i = 62; ~i; --i)
{
if (!a[i]) continue;
t = 1ll << i - 1;
for (int j = i - 1; ~j; --j, t >>= 1)
if (a[i] & t)
a[i] ^= a[j];
}
for (int i = 0; i <= 62; ++i)
if (a[i])
p.push_back(a[i]);
}
ll kth(ll k)
{
if (flag) --k;//答案集合中有0
ll ans = 0;
if (k >= (1ll << p.size()))
return -1;
ll t = 1ll << 62;
for (int i = 62; ~i; --i, t >>= 1)
if (k & t)
ans ^= p[i];
return ans;
}
inline ll &operator[](int i)
{
return a[i];
}
base operator+(base &b) const
{
base ans = *this;
for (int i = 0; i <= 62; ++i)
if (b[i])
ans.insert(b[i]);
return ans;
}
};