码迷,mamicode.com
首页 > 其他好文 > 详细

异或线性基练习

时间:2019-01-28 14:04:11      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:维护   统计   简便   素数   span   int   定义   线性代数   一个   

异或线性基定义:

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

 

异或线性基练习

标签:维护   统计   简便   素数   span   int   定义   线性代数   一个   

原文地址:https://www.cnblogs.com/uid001/p/10327114.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!