【學習小結】線性基

menci的講解

發現了線性基的一些性質和用法

線性基合併
直接把另一個暴力插入。
可以判一下如果滿了就不插入,剪枝很有作用

一定要滿足從高位到低位貪心

struct Data{
	int a[32];
	bool flag;

	Data(){ memset(a,0,sizeof(a)); flag = 0; }
	Data operator + (Data z){
		Data res = z;
		if ( z.flag ) return res;
		if ( flag ) return *this;
		for (int i = 30 ; i >= 0 ; i--){
			int x = a[i];
			for (int j = 30 ; j >= 0 ; j--){
				if ( x >> j & 1 ){
					if ( !(res.a[j] >> j & 1) ){ res.a[j] = x; break; }
					x ^= res.a[j];
				}
			}
		}
		res.flag = 1;
		for (int i = 29 ; i >= 0 ; i--){
			res.flag &= (res.a[i] >> i) & 1;
			if ( res.a[30] >> i & 1 ){
				res.a[30] ^= res.a[i];
			}
		}
		return res;
	}
	void insert(int x){
		for (int j = 29 ; j >= 0 ; j--){
			if ( x >> j & 1 ){
				if ( !(a[j] >> j & 1) ){ a[j] = x; break; }
				x ^= a[j];
			}
		}
	}
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章