线性基【模板】

文章目录

  • 题目链接:
  • 线性基的用处

题目链接:

①:洛谷P3812
②:牛客练习赛26D
参考博客:https://www.cnblogs.com/olinr/p/9477787.html
这位童鞋写得很好~
求异或最大值

#include"bits/stdc++.h"
using namespace std;
typedef long long LL;
const int maxn=1e5+5;
const int MOD=1e9+7;
const int bit=62;
LL Line[bit+5];
void Insert(LL x)
{
	for(int j=bit; j>=0; j--)
	{
		if(x&(1LL<<j))//这里注意是1LL,容易错
		{
			if(Line[j]==0)//如果这一行还全部是0
			{
				Line[j]=x;
				return ;
			}
			else x^=Line[j];//还有这里,是把进来的数x的这一位异或掉
		}
	}
}
LL getMax()
{
	LL res=0;
	for(int i=bit; i>=0; i--)
	{
		if((res^Line[i])>res)res^=Line[i];
	}
	return res;
}
int main()
{
	int N;
	while(cin>>N)
	{
		memset(Line,0,sizeof Line);
		for(int i=1; i<=N; i++)
		{
			LL t;
			cin>>t;
			Insert(t);
		}
		cout<<getMax()<<endl;
	}
}

线性基的用处

①:就是求异或和最大
②:就是求这个只含01的方阵的秩
比如牛客上面的这道题:牛客练习赛49 E 筱玛爱游戏就是转换成线性基来做

你可能感兴趣的:(模板)