ZTL — 数据结构 — 线性基
目前版本:支持添加,查询是否存在,求最大最小值。限ll值域
class LinearBasis{
typedef long long ll;
private:
bool minzero = 0;
const ll MAX_DIGIT = 62;
//切记!1ll<<63是未定义行为(UB)!
ll xxj[MAX_DIGIT]
public:
inline void add(int x){
for(int i = MAX_DIGIT, i >= 0; --i){
if(x >= (1ll << i)){
if(xxj[i]) x ^= xxj[i];
else{
xxj[i] = x;
minzero = 1;
break;
}
}
}
}
inline ll ask_max(ll x = 0){
ll ans = x;
for(int i = MAX_DIGIT; i >= 0; --i){
if((ans ^ xxj[i]) > ans){
ans ^= xxj[i];
}
}
return ans;
}
inline ll ask_min(ll x = 0){
if(minzero) return 0;
for(int i = 0; i <= MAX_DIGIT; ++i){
if(xxj[i]) return xxj[i];
}
return -1;//empty;
}
inline bool check(ll x){
for(int i = MAX_DIGIT; i >= 0; --i){
if(x & (1ll<<i)){
if(!a[i]) return false;
else x ^= a[i];
}
}
return true;
}
};