卧薪尝胆,厚积薄发。
Zero XOR Subset-less
Date: Sun Jan 13 16:12:05 CST 2019 In Category: NoCategory

Description:

给一个数组 $a$ ,把他划分成尽量多的段使得不存在一个段的集合异或和为零。
$1\leqslant n\leqslant 2\times 10^5$

Solution:

我们可以把划分成 $n$ 段看成先选全部的,然后再选出尽量多的个后缀,使得没有一个后缀的异或和为零,那么两个相邻的后缀之间的部分就是划分出的段,那么只要所有后缀是线性无关的,那么后缀之间的差一定也是线性无关的,因为如果存在几段之间线性相关,那么那几个后缀一定是线性相关的,于是这就是一个经典的线性基上贪心的问题了。

Code:


#include<bits/stdc++.h>
using namespace std;
int n;
#define MAXN 200010
int a[MAXN];
struct LB
{
int d[31];
int insert(int x)
{
for(int i = 30;i >= 0;--i)
{
if(x & (1 << i))
{
if(d[i] == 0)
{
d[i] = x;
return 1;
}
else
{
x ^= d[i];
}
}
}
return 0;
}
}s;
int main()
{
scanf("%d",&n);
for(int i = 1;i <= n;++i)scanf("%d",&a[i]);
for(int i = 1;i <= n;++i)a[i] ^= a[i - 1];
if(a[n] == 0){puts("-1");return 0;}
int ans = 1;
s.insert(a[n]);
for(int i = 1;i <= n;++i)ans += s.insert(a[i]);
cout << ans << endl;
return 0;
}
Copyright © 2020 wjh15101051
ღゝ◡╹)ノ♡