CF1101G (Zero XOR Subset)-less

亦或,线性基,构造

题意

给出一个序列\(\{a_i\}\),试将其划分为尽可能多的非空子段,满足每一个元素出现且仅出现在其中一个子段中,且在这些子段中任取若干子段,它们包含的所有数的异或和不能为\(0\)

\(1 \leq n \leq 2*10^5\)\(0 \leq a_i \leq 10^9\)

题解

很明显,这个序列的若干个前缀亦或和亦或起来不能为零,也就是要满足构成一个线性基。

直接插入并求出大小即可。

代码

#include<bits/stdc++.h>
using namespace std;
const int Maxn=2e5+10;
int n,lst;
int p[62],sz;
bool insert(int x)
{
    for(int i=60;i>=0;i--) if((x>>i)&1)
    {
        if(!p[i]) return p[i]=x,1;
        x^=p[i];
    }
    return 0;
}
signed main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        int x; cin>>x; lst^=x;
        if(insert(lst)) sz++;
    }
    cout<<(lst?sz:-1)<<endl;
    return 0;
}
posted @ 2025-12-23 15:36  crazy--boy  阅读(2)  评论(0)    收藏  举报