线行基模板

90 阅读1分钟

参考

const int d=30;
struct Linear_Base {
    int a[d];

    void init() {//初始化
        memset(a, 0, sizeof a);
    }

    void insert(int x) {//插入元素
        for (int i = d; i >= 0; i--)
            if (x >> i & 1) {
                if (a[i]) x ^= a[i];
                else {
                    a[i] = x;
                    return;
                }
            }
    }

    void operator+=(const Linear_Base &t) {//合并线性基
        for (int i = d; i >= 0; i--)
            insert(t.a[i]);
    }

    int query() {//查询最大异或值
        int ans = 0;
        for (int i = 29; i >= 0; i--)
            if ((ans ^ a[i]) > ans) ans ^= a[i];
        return ans;
    }
};