异或空间线性基
异或空间线性基
- 2024/9/9 CCPC 预选赛碰到了基本从未见过的线性基,但是,其实没有多难
采用高斯消元法求得的一组线性基,具有以下优点:
-
方便求第
大的异或和,就是选 的二进制对应的哪些行。 (注意,代码中的 函数是求第 小的函数) -
方便知道原数组是否能组成
,即消元后看有无全零行。
int n;
ll a[N];
bool zero;
ll p[N];
int xxjcnt;
int Gauss(){
// 此构造线形基出的是降序排序,大小为 xxjcnt 个,编号从 1 开始
for(int i = 1; i <= n; i++){
p[i] = a[i];
}
int i, k = 1;
ll j = (ll) 1 << 62; // 注意不是 63;
for(; j; j >>= 1){
for(i = k; i <= n; i++) {
if (p[i] & j) {
break; // 找到了第 j 位上的 1
}
}
if(i > n){
continue; // 没有找到第 j 位上的 1
}
swap(p[i], p[k]);
for(i = 1; i <= n; i++){
if(i != k && p[i] & j){
p[i] ^= p[k];
}
}
k++;
}
k--;
if(k != n){
zero = true;
}else{
zero = false;
}
return k;
}
ll Query(ll k){
ll ans = 0;
if(zero) k--;
if(!k){
return 0;
}
for(int i = xxjcnt; i; i--){
if(k&1){
ans ^= p[i];
}
k >>= 1;
}
if(k){
return -1; // 代表超出范围,没有查询到
}
return ans;
}
以及
void solve() {
cin >> n;
for(int i = 1; i <= n; i++){
cin >> a[i];
}
xxjcnt = Gauss(); // 别忘了给 xxjcnt 赋值
int q;
cin >> q;
for(int i = 1; i <= q; i++){
int k;
cin >> k;
cout << Query(k) << endl;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)