按位計算,如果相同記為0,不同記為1。
如果,a⊕b=c, c⊕b=a
交換律結合律
對於任何數, x⊕x=0,x⊕0=x
對 於一
段序列a
n,異或
和為a1
⊕a2⊕
...⊕
an
對於一段序列a_n,異或和為a_1⊕a_2⊕...⊕a_n
對於一段序列
an,
異或和為
a1⊕
a2⊕
...⊕
an設t⊂
s,所有
這樣的子
集t的異
或和組成
的集合稱
為集合s
的張成,
記作sp
an(s
)。即,
在s中選
出任意多
個數,其
異或和的
所有可能
的結果組
成的集合
。設t\subset s ,所有這樣的子集 t的異或和組成的集合稱為集合 s的張成,記作 span(s)。即,在s中選出任意多個數,其異或和的所有可能的結果組成的集合。
設t⊂s,所
有這樣的
子集t的
異或和組
成的集合
稱為集合
s的張成
,記作s
pan(
s)。即
,在s中
選出任意
多個數,
其異或和
的所有可
能的結果
組成的集
合。對 於s
j⊂s,
如果去掉
sj後的
張成不變
,就稱為
線性相關
的對於s_j\subset s,如果去掉s_j後的張成不變,就稱為線性相關的
對於sj⊂
s,如果
去掉sj
後的張
成不變,
就稱為線
性相關的
我們稱集合b是集合 s的線性基,當且僅當:
s∈span(b),即s是b的張成的子集;
是線性無關的。
集合 b中元素的個數,稱為線性基的長度。
線性基有以下基本性質:
1.b是極小的滿足線性基性質的集合,它的任何真子集都不可能是線性基;
2.s中的任意元素都可以唯一表示為 中若干個元素異或起來的結果。
我們想把線性基構造成形如:這樣的線性基,在對角線上有1,即在主元位置上有1,
[ 10
0001
0000
1000
01
]\left[ \begin 1&0&0 &0\\ 0&1 &0&0\\ 0&0&1 &0\\ 0& 0 &0&1\\ \end \right]
⎣⎢⎢⎡1
000
0100
001
000
01⎦
⎥⎥⎤
1.列舉x的所有為1的二進位制 j:l->0
2.如果a
ja_j
aj!=0 將x的這一位消掉,x^=a
ja_j
aj3.如果a
ja_j
aj=0,將j之後的所有在主元位置上的1去掉,將l->j之前的在j位置的1去掉。
bool
ins(ll x)
else
b[j]
=x;return1;
}}return0;
}
通過這個方法就可以得到在主元位置有1的線性基。
1.洛谷p3812 線性基模板,xor最大值
#include
using
namespace std;
typedef
long
long ll;
const
int n=
100;
ll b[n]
;int l=
0,n;
bool
ins(ll x)
else
b[j]
=x;return1;
}}return0;
}int
main()
ll ans=0;
for(
int i=l;i>=
0;i--
) ans^
=b[i]
;printf
("%lld\n"
,ans)
;return0;
}
2.hdu3949 第k小
#include
using
namespace std;
typedef
long
long ll;
ll b[
200]
,v[200];
//b為構造的線性基,v為整理後的線性基
int t,l;
int n,m,cnt;
bool
ins(ll x)
else
b[j]
=x;return1;
}}return0;
}ll find_kth
(ll x)
return ans;
}int
main()
for(
int i=
0;i<=l;i++)if
(b[i]
) v[cnt++
]=b[i]
;//從低到高
scanf
("%d"
,&m)
;printf
("case #%d:\n"
,cas)
;for
(int i=
1;i<=m;i++)}
return0;
}
3.洛谷p4570
4.acwing 229
5.acwing 210
6.tjoi2008 彩燈
推薦這位dalao的講解
線性基學習筆記
線性基是幹嘛的呢?給定n個數,求所有數的異或和最大是多少?求解這類問題的時候,就需要線性基了 個人感覺線性基本身就一種貪心。首先定義ba se i bas e i 表示最高位1在i位的數是什麼 對於新進來的數tm p tmp 我們先找出他最高位上的1,假設為第 j j 位,然後看一下ba se j ...
線性基 學習筆記
includeusing namespace std using ll long long const int maxn 5e5 5 原來的數 const int maxbit 63 ll a maxn 原來的數 ll p maxbit p j 第j位為最高位1的數 最高位1在第j位的數 int m...
線性基學習筆記
線性基是乙個數的集 合數的集合 數的集合 並且每個序列都擁有至少一 個線性基 至少乙個線性基 至少乙個線性 基,取線性基中若干個數異或起來可以得到原序列中的任何乙個數。1.原序列裡面的任意乙個數都可以由線性基裡面的一些數異或得到 2.線性基裡面的任意一些數異或起來都不能得到0 3.線性基裡面的數的個...