zoukankan      html  css  js  c++  java
  • 线性基模板(线性基)

    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
    }
    
  • 相关阅读:
    遇到的两个问题
    项目分析(map复习)
    while小问题
    二级指针
    映射文件实现进程通信
    struct {0}初始化
    用boost共享内存实现进程通信的例子
    mongo二维数组操作
    项目分析(channelid是如果产生的)
    string为什么可以写入共享内存
  • 原文地址:https://www.cnblogs.com/flashhu/p/9656447.html
Copyright © 2011-2022 走看看