线性基模板

  • 插入
  • \(k\)
  • 排名
  • 最大异或和
struct Basis
{
	vector<ll>s;
	
	void insert(ll val)
	{
		for(int x:s)val=min(val,val^x);
		for(int &x:s)x=min(x,x^val);
		if(val)s.push_back(val);
	}
	ll kth(ll k)
	{
		sort(s.begin(),s.end());
		if(s.size()<n)k--;
		ll res=0;
		for(ll x:s)
		{
			if(k&1)res^=x;
			k>>=1;
		}
		return !k?res:-1;
	}
	ll rk(ll val)
	{
		sort(s.begin(),s.end());
		ll res=0;
		for(int i=0;i<s.size();i++)
			if((val^s[i])<val)res|=1ll<<i;
		return res+1;
	}
	ll mx(ll val)
	{
		sort(s.begin(),s.end(),greater<ll>());
		for(ll x:s)val=max(val,(val^x));
		return val;
	}
}S;
posted @ 2023-09-11 20:50  BrainLE  阅读(17)  评论(0)    收藏  举报