bzoj 4269 再见Xor

LINK:再见Xor

求一个序列中 异或最大值 和 异或严格次大值。

显然 线性基可以异或出序列的任何值。所以我们从高位到低位贪心就可以求出最大值。

考虑严格次大值 可以发现我们求出最大值之后需要再异或一个数字 或多个数字让最大值变得更小。

不满足单调性 所以不能二分 我们考虑去掉一个最小的数字就是严格次大 显然最小的数字为线性基中最小的那个数字。

去掉即可。


int n;
int f[32];
inline void insert(int x)
{
	for(int i=30;i>=0;--i)
	{
		if(x&(1<<i))
		{
			if(!f[i]){f[i]=x;break;}
			else x=x^f[i];
		}
	}
}
int main()
{
	freopen("1.in","r",stdin);
	get(n);
	rep(1,n,i)insert(read());
	int maxx=0,minn;
	for(int i=30;i>=0;--i)
	{
		if((maxx^f[i])>maxx)maxx=maxx^f[i];
		if(f[i])minn=f[i];
	}
	printf("%d %d\n",maxx,maxx^minn);
	return 0;
}
posted @ 2020-03-21 11:26  chdy  阅读(91)  评论(0编辑  收藏  举报