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;
  	}
};
posted @ 2020-10-14 15:45  zimindaada  阅读(159)  评论(0编辑  收藏  举报