線性基是幹嘛的呢?
給定n個數,求所有數的異或和最大是多少?
求解這類問題的時候,就需要線性基了
個人感覺線性基本身就一種貪心。
首先定義ba
se[i
] bas
e[i]
表示最高位1在i位的數是什麼
對於新進來的數tm
p tmp
,我們先找出他最高位上的1,假設為第
j j
位,然後看一下ba
se[j
]' role="presentation" style="position: relative;">bas
e[j]
base
[j]有沒有數,如果沒有,直接將它賦值成tm
p tmp
,如果有,那就tm
p=ba
se[j
] tmp
=bas
e[j]
就有點像高斯消元 對,把tm
p tmp
這位的1消去(或者說,這個數去掉這位1之後,還能對哪些ba
seb as
e作貢獻),那麼我們考慮,經過這個處理,tm
p tmp
要麼被加入了base,要麼變成了0(就是他可以被之前的數異或得到)求m
axm ax
的時候,我們就貪心即可
#include
#include
#include
#include
#include
#define ll long long
using
namespace
std;
inline ll read()
while (isdigit(ch))
return x*f;
}ll n,tmp;
ll base[110];
int main()
tmp^=base[j];}}
} ll ans=0;
for (int i=63;i>=0;i--)
cout
0;}
這裡補充乙個線性基的性質:
1>同時線性基的任何乙個非空子集都不會使得其xo
r xor
和為02>果有很多個數,我們可以構出這些數的線性基,那麼這個線性基可以通過互相xor,能夠構出原來的數可以相互xor構出的所有的數。就可以減少判斷的時間和次數。
線性基 學習筆記
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...
線性基 學習筆記
按位計算,如果相同記為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...
線性基學習筆記
線性基是乙個數的集 合數的集合 數的集合 並且每個序列都擁有至少一 個線性基 至少乙個線性基 至少乙個線性 基,取線性基中若干個數異或起來可以得到原序列中的任何乙個數。1.原序列裡面的任意乙個數都可以由線性基裡面的一些數異或得到 2.線性基裡面的任意一些數異或起來都不能得到0 3.線性基裡面的數的個...