异或空间线性基

异或空间线性基

  • 2024/9/9 CCPC 预选赛碰到了基本从未见过的线性基,但是,其实没有多难

采用高斯消元法求得的一组线性基,具有以下优点:

  • 方便求第 k 大的异或和,就是选 2xxjcntk 的二进制对应的哪些行。 (注意,代码中的 Query 函数是求第 k 小的函数)

  • 方便知道原数组是否能组成 0 ,即消元后看有无全零行。

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

以及 main 函数:

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;
    }
}
posted @   9102700  阅读(27)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
  1. 1 鼓楼 赵雷
  2. 2 我们的歌 王力宏
  3. 3 老街 李荣浩
  4. 4 周杰伦
  5. 5 可惜没如果 林俊杰
  6. 6 不将就 李荣浩
  7. 7 南方姑娘 赵雷
  8. 8 南方姑娘(弹唱版) 赵雷
  9. 9 如果可以 韦礼安
  10. 10 写给黄淮 邵帅
  11. 11 我想念 汪苏泷
  12. 12 雨天 汪苏泷
  13. 13 雨天雨天 汪苏泷
  14. 14 成都 赵雷
我们的歌 - 王力宏
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

作词 : 王力宏/陈信延

作曲 : 王力宏

编曲 : 王力宏

已经听了一百遍

已经听了一百遍

怎么听都不会倦

从白天唱到黑夜

你一直在身边

如果世界太危险

只有音乐最安全

带着我进梦里面

让歌词都实现

无论是开心还是难过我的爱一直不变

不必担心时间流逝带走一切

无论是Hip-Hop 还是摇滚我的爱一直不变

所有美好回忆记录在里面

这种 Forever Love 那么深

我们的歌 那么真

无国界跨时代

再也不会叫我Kiss Goodbye

要每一句能够动人心弦 Yeah

情人总分分合合

可是我们却越爱越深

认识你 让我的幸福如此悦耳

能不能不要切歌

继续唱我们的歌​​

让感动一辈子都记得

已经听了一百遍

已经听了一百遍

怎么听都不会倦

从白天唱到黑夜

你一直在身边

如果世界太危险

只有音乐最安全

带着我进梦里面

让歌词都实现

无论是开心还是难过我的爱一直不变

不必担心时间流逝带走一切

无论是Hip-Hop 还是摇滚我的爱一直不变

所有美好回忆记录在里面

这种 Forever Love 那么深

我们的歌 那么真

无国界跨时代

再也不会叫我Kiss Goodbye

要每一句能够动人心弦 Yeah

情人总分分合合

可是我们却越爱越深

认识你 让我的幸福如此悦耳

能不能不要切歌

继续唱我们的歌​​

让感动一辈子都记得

情人总分分合合

情人总分分合合

可是我们却越爱越深

认识你 让我的幸福如此悦耳

能不能不要切歌

继续唱我们的歌​​

让感动一辈子都记得

电吉他/其他乐器:王力宏

鼓手:Eric Fawcrtt

贝斯:John Mumson

录音师/录音室:王力宏/Homeboy Music Studios,Taipei

OP:HIM Music Publishing Inc.

OP:Homeboy Music,Inc,Taiwan

SP:Sony Music Publishing(Pre)Ltd.Taiwan Branch

点击右上角即可分享
微信分享提示