模板—数学—线性基

模板—数学—线性基

Code(高斯消元版):

#include <cstdio>
#include <algorithm>
using namespace std;
#define N 1000010
long long num[N],place[N],ans; int n; bool v[N];
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%lld",&num[i]);
	for(int j=63;~j;j--)
	{
		int p=0;
		for(int i=1;(!p)&&i<=n;i++)
			if((!v[i])&&((num[i]>>j)&1ll)) p=i;
		if(!p) {place[j]=0;continue;}
		v[p]=true,place[j]=num[p];
		for(int i=1;i<=n;i++) if(i!=p&&((num[i]>>j)&1ll))
			num[i]^=num[p];
	}
	for(int i=63;~i;i--) ans=max(ans,ans^place[i]);
	printf("%lld\n",ans);
}

Code(普通版):

#include <cstdio>
#include <algorithm>
using namespace std;
long long place[100],x,ans; int n;
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%lld",&x);
        for(int j=63;~j;j--) if((x>>(j*1ll))&1ll)
        {
            if(!place[j]) {place[j]=x;break;}
            else x^=place[j];
        }
    }
    for(int i=63;~i;i--) if(ans<(ans^place[i])) ans^=place[i];
    printf("%lld\n",ans);
}

  

posted @ 2019-04-04 20:51  Yang1208  阅读(218)  评论(0编辑  收藏  举报