J. 找最小

  • “交换”其实是一个很抽象的操作
  • 因为你并不关心“交换”这个操作本身,而只关心它产生的影响
  • 考虑把“交换”具像化。它等价于将f(a)、f(b)同时异或上(ai^bi)
  • 引入线性基算法,问题解决
  • 其实你已经感受到了这种类似于“自动机”的感觉,也想到了线性基算法,但,对什么序列构建异或空间呢?a和b当然不行,因为你并不关心孤立的个体,而只关心它们联系产生的整体——ai^bi
  • 当你重新审视一道题目时,应当抛却最初的想法(按位考虑),这样,灵感火花才有迸发的空间
点击查看代码
#include <bits/stdc++.h>
using namespace std;
int a[1000005],b[1000005],c[1000005];
int val[31];
void insert(int x)
{
	for(int i=30;i>=0;i--)
	{
		if(((x>>i)&1)==1)
		{
			if(val[i]==0)
			{
				val[i]=x;
				return;
			}
			else
			{
				x^=val[i];
			}
		}
	}
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	int T;
	cin>>T;
	while(T--)
	{
		memset(val,0,sizeof(val));
		int n,sum=0;
		cin>>n;
		for(int i=1;i<=n;i++)
		{
			cin>>a[i];
			sum^=a[i];
		}
		int tot=0;
		for(int i=1;i<=n;i++)
		{
			cin>>b[i];
			c[i]=(a[i]^b[i]);
			insert(c[i]);
			tot^=c[i];
		}
		int x=sum;
		for(int i=30;i>=0;i--)
		{
			if(max(x^val[i],x^val[i]^tot)<max(x,x^tot))
			{
				x^=val[i];
			}
		}
		cout<<max(x,x^tot)<<endl;
	}
	return 0;
}
posted @ 2024-09-09 10:58  D06  阅读(5)  评论(0编辑  收藏  举报