線性基模板(線性基)


stO ppl Orz

蒟蒻寫了個模板,通過了對拍檢驗。

該模板資磁ppl的博客中提到的所有操作,除了getmin和getmax的意義不同。

蒟蒻的getmin和getmax是求線性基內能與x異或出的最小/大值。那么ppl的getmax等價於這里的getmax(0)。

可兼容bitset(不能使用getmin,getmax和getkth),可兼容二進制高精度模板

#include<bits/stdc++.h>
using namespace std;
namespace FlashHu{
#define I inline
#define RG register
#define R RG T
#define UI unsigned int
	template<typename T,const UI L>
	struct LB{
		T a[L];
		LB(){
			memset(a,0,sizeof(a));
		}
		I void operator+=(R x){
			for(RG UI i=L-1;x!=0;--i)
				if(((T)1<<i&x)!=0){
					if(a[i]==0){a[i]=x;return;}
					x^=a[i];
				}
		}
		I void operator+=(RG LB&x){
			for(RG UI i=0;i<L;++i)
				*this+=x.a[i];
		}
		I bool exist(R x){
			if(x==0)return 0;
			for(RG UI i=L-1;x!=0;--i)
				if(((T)1<<i&x)!=0){
					if(a[i]==0)return 0;
					x^=a[i];
				}
			return 1;
		}
		I T getmin(R x){
			for(RG UI i=L-1;~i;--i)
				if(x>(x^a[i]))x^=a[i];
			return x;
		}
		I T getmax(R x){
			for(RG UI i=L-1;~i;--i)
				if(x<(x^a[i]))x^=a[i];
			return x;
		}
		I T getkth(R k){
			R x=1;
			RG UI i,j;
			static T b[L];
			for(i=0;i<L;++i,x<<=1)
				for(j=i+1;j<L;++j)
					if((a[j]&x)!=0)a[j]^=a[i];
			for(i=j=0;i<L;++i)
				if(a[i]!=0)b[j++]=a[i];
			if((T)1<<j<=k)return 0;
			x=0;
			for(i=0;i<L;++i)
				if(((T)1<<i&k)!=0)x^=b[i];
			return x;
		}
	};
#undef I
#undef RG
#undef R
#undef UI
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM