基础定义:
张成
设 \(T\subseteq S\) ,所有这样子集 \(T\) 的异或和组成的集合称为集合 \(S\) 的张成,记作 \(span(S)\) ,即从 \(S\) 中选出任意多个数,其异或和的所有可能的结果组成的集合。
线性相关
对于一个集合 \(S\) ,如果存在一个元素 \(S_i\) ,使得,\(S\) 在去除这个元素后得到的集合 \(S^{'}\) 的张成 \(span(S^{'})\) 中包含 \(S_i\) ,即 \(S_i\in{span(S^{'})}\) ,则称集合 \(S\) 线性相关。
更形象地,可以表示为,存在一个元素 \(S_i\) ,可以用其它若干个元素异或起来得到。
相对的,如果不存在这样的元素 \(S_i\),则称集合 \(S\) 线性无关。
一个显然的结论是,对于这个线性相关的集合 \(S\) ,去除这个元素后,集合的张成不变。
线性基
我们称集合 \(B\) 是集合 \(S\) 的线性基,当且仅当:
1.$ S\in{span(B)} $。
2.B是线性无关的。
学习博客
线性基用处:用来解决异或和问题。
struct LinearBasis
{
# define N 64
# define reg register
# define TT template<class T>
# define LL long long
LL base[N];
TT
inline void Insert(T x)
{
for(reg LL i = N-1; ~i ; --i)
if(x & (1LL << i))//可简化成 (x >> i)
{
x ^= base[i];
if(base[i] == 0){base[i] ^= x;return;}
}
}
TT
inline bool Check(T x)
{
for(reg int i = N-1; ~i ; --i)
if(base[i]) x ^= base[i];
return x == 0;
}
inline void Merge(LinearBasis x)
{
for(reg int i = N-1; ~i ; --i) if(x.base[i]) Insert(x.base[i]);
}
inline LL Xor_Sum_Max()
{
LL res = 0;
for(reg int i = N-1; ~i ; --i) if((res ^ base[i]) > res) res ^= base[i];
return res;
}
inline LL Xor_Sum_Min()
{
LL res = 0;
for(reg int i = N-1; ~i ; --i) if((res ^ base[i]) < res) res ^= base[i];
return res;
}
# undef N
# undef reg
# undef TT
# undef LL
} T;
题目
洛谷 P4839
洛谷 P3812
洛谷 P4570
洛谷 P3857
洛谷 P4151
洛谷 P4301