题解 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; }
不要妄图追上西坠的太阳,而是要在黎明前就等着它!