codeforces 1101G. (Zero XOR Subset)-less

版权声明:菜鸡blog,随便转载 https://blog.csdn.net/qq_36808030/article/details/86351213

题意:

将一个序列分成尽量多的段,每段值为异或值,且使得不存在非空子集异或和为0。

题解:

转为前缀和,然后就是选最多元素且不存在非空子集异或和为0。
然后就没了?
线性基的大小即是答案。
code:

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
using namespace std;
int n,a[200010],b[200010],ans=0;
int c[33];
void add(int o)
{
	for(int i=29;i>=0;i--)
		if((1<<i)&o)
		{
			if(!c[i]) {c[i]=o,ans++;return;}
			else o^=c[i];
		}
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]),b[i]=b[i-1]^a[i];
	if(b[n]==0) return puts("-1"),0;
	for(int i=n;i>=1;i--) add(b[i]);
	printf("%d",ans);
}

猜你喜欢

转载自blog.csdn.net/qq_36808030/article/details/86351213