1. 程式人生 > >異或線性基練習

異或線性基練習

urn 空間 style pan -s nbsp 子集 一個 高斯消元

異或線性基定義:

設$S$為一個集合, $a_1,a_2,...,a_r$為$S$的一個子集, 若滿足

$(1)a_1,a_2,...,a_r$線性無關 (在$a_1,a_2,...,a_r$中任選元素的異或和均不為$0$)

$(2)S$中每個元素均可由$a_1,a_2,...,a_r$異或得到

則$a_1,a_2,...,a_r$為$S$的異或線性基

一些性質:

$(1)S$與$S$的異或線性基等價

$(2)S$張成的元素數$=2^r$

線性基的求法:

可以利用線性代數中高斯消元, 但有更簡便做法, 一般是采用動態插入維護線性基, 這裏直接給出代碼

void ins(int x) {
    REP(i,
1,*a) x = min(x, x^a[i]); if (x) a[++*a] = x; }

$*a$統計維數, 最後$a_1,a_2,...a_*a$即為線性基的一個等價向量組

如果求張成空間中最大元素可以由貪心很容易得到

ll query() {
    ll ans = 0;
    REP(i,1,*a) ans = max(ans, ans^a[i]);
    return ans;                                                       
}

異或線性基練習