题解 CF1101G 【(Zero XOR Subset)-less】

这道题目我们可以用线性基解决

线性基的定义:

对于n个数,a1,a2,a3,a4……

线性基b1,b2……

线性基满足的情况是这n个数,其中的任意个数的异或值都能用数组b中的某几个数求出来。

我们先来看看无解的情况,如果所有数的异或和为0,不管你怎么分都是无解。

如果有解,直接输出线性基就好了。

为什么线性基是正确的呢?

线性基中的任意几个数都不可能异或是0,这个性质我们可以通过反证法来进行,如果异或是0的话,那就说明这个这几个数中,存在可以互相表达的情况,这就有违求线性基的过程了。

#include<bits/stdc++.h>
using namespace std;
int Total;
int Array[200001];
int Prefix[200001];
int Basic[31];
int Ans;
inline void Add(int X)
{
    register int i;
    for(i=30;i>=0;i--)
    {
        if(X&(1<<i))
        {
            if(Basic[i])
            {
                X^=Basic[i];
            }
            else
            {
                Ans++;
                Basic[i]=X;
                break;
            }
        }
    }
}
int main(void)
{
    register int i;
    cin>>Total;
    for(i=1;i<=Total;i++)
    {
        cin>>Array[i];
        Prefix[i]=Prefix[i-1]^Array[i];
    }
    if(!Prefix[Total])
    {
        goto UnSolve;
    }
    for(i=1;i<=Total;i++)
    {
        Add(Prefix[i]);
    }
    cout<<Ans<<endl;
    return 0;
    UnSolve:
        cout<<-1<<endl;
        return 0;
}
View Code

 

posted @ 2020-08-08 14:29  Bushuai_Tang  阅读(84)  评论(0编辑  收藏  举报