線性基是乙個數的集合,並且每個序列都擁有至少乙個線性基,取線性基中若干個數異或起來可以得到原序列中的任何乙個數。
原序列裡面的任意乙個數都可以由線性基裡面的一些數異或得到
線性基裡面的任意一些數異或起來都不能得到 0
線性基裡面的數的個數唯一,並且在保持性質一的前提下,數的個數是最少的
線性基中每個元素的二進位制最高位互不相同。
對於要插入的數x,可以從大到小列舉每乙個二進位制位,如果這一位為 1 ,並且如果這一位的p[ i ]不存在,我們直接讓這一位的p[ i ]等於 x ,否則就讓 x ^ p[ i ] , 繼續判斷x是否能成為下一位的p[ i ],這樣最後得到的 p 陣列就是這個序列的線性基。
void
add(ll x)}}
}
區間異或和最大
這裡同樣是從最高位列舉,如果 ans異或上這一位的p[i]能使ans變大,那麼就讓它 異或上p[i],這樣最後得到的ans就是所求的答案。
下面是乙個模板題
#include
using
namespace std;
typedef
long
long ll;
const
int maxn=
4e6+7;
const
int mod =
998244353
;int n;
ll a[maxn]
,p[maxn]
;void
add(ll x)}}
}int
main()
ll ans =0;
for(
int i =
60; i >=
0; i --
) printf (
"%lld\n"
,ans)
;}
線性基學習
除了xor b不存在異或為0的結果外,xor a和xor b可以說是相等的。結果是相同的,但壓縮了空間,除此外線性基還有很多比較方便的性質。到題目裡細講 講的不是很嚴謹,大意是這樣。更詳細可以看這裡 線性基模板以及講解然後開始刷題。1.bzoj2460 題意 給n塊石頭,石頭有兩個屬性標號id和魔法...
線性基學習筆記
線性基是幹嘛的呢?給定n個數,求所有數的異或和最大是多少?求解這類問題的時候,就需要線性基了 個人感覺線性基本身就一種貪心。首先定義ba se i bas e i 表示最高位1在i位的數是什麼 對於新進來的數tm p tmp 我們先找出他最高位上的1,假設為第 j j 位,然後看一下ba se j ...
線性基入門學習
前置技能點 線性相關,線性無關 張成 spa nspan span s ss的所有子集 包括空集 的異或和組成的集合,叫做集合s ss的張成。什麼是線性基 線性基可以理解為集合s ss在異或運算中的壓縮,即集合s ss的線性基中的元素進行異或運算可以表示出集合中的元素進行異或運算的所有結果。換句話說...