洛谷P3812线性基[模板]

我们需要^出一个最大值,那么我们能够造的最大值,应该是最大的数写成二进制之后全填上1,但是我们不能保证每一位都是1

所以我们可以处理处使这一二进制位为1的数,然后枚举每一位^

代码

//By AcerMo
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int M=100;
long long int n;
long long int a[M];
long long int b[M];
long long int ans;
int main()
{
	cin>>n;
	for (int i=1;i<=n;i++) cin>>a[i];
	for (int i=1;i<=n;i++)
	{
		for (int k=60;~k;k--)
		if (a[i]&(1LL << k))//a[i]中包含该二进制位 
		{
			if (!b[k]) {b[k]=a[i];break;}//判断之前是不是可以^到当前二进制位,不能则可以通过a[i]弄到 
			else a[i]^=b[k]; //之前可以弄,那么将a[i]中与之前重叠的部分^掉,然后考虑低位 
		}
	}
	for (int i=60;~i;i--)
	if ((ans^b[i]) > ans) ans^=b[i]; 
	cout<<ans;
	return 0;	 
}

猜你喜欢

转载自blog.csdn.net/acerandaker/article/details/80885590