异或线性基练习

异或线性基定义:

设$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;                                                       
}

猜你喜欢

转载自www.cnblogs.com/uid001/p/10327114.html
今日推荐