Light OJ 1272 Maximum Subset Sum 高斯消元 最大XOR值

题目来源:Light OJ 1272 Maximum Subset Sum

题意:选出一些数 他们的抑或之后的值最大

思路:每个数为一个方程 高斯消元 从最高位求出上三角 消元前k个a[i]异或和都能有消元后的异或和组成

消元前

k

a[i]

a[i]异或和都能有消元后的

异或和都能有消元后的

p

a[i]

a[i]的异或

的异或

保证每一列只有一个1 消元后所有A[i]抑或起来就是答案

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 110;
typedef long long LL;
typedef LL Matrix[maxn];
LL x[maxn];
void gauss(Matrix A, int n)
{
	int i = 0, j = 63, k, u, r;
	while(i < n && j >= 0)
	{
		int r = i;
		for(k = i; k < n; k++)
			if((A[k]>>j)&1)
			{
				r = k;
				break;
			}
		if((A[r]>>j)&1)
		{
			if(r != i)
				swap(A[i], A[r]);
			for(u = 0; u < n; u++)
			{
				if(u != i && (A[u]>>j)&(A[i]>>j))
					A[u] ^= A[i];
			}
			i++;
		}
		j--;
	}
}

Matrix A;
int main()
{
	int cas = 1;
	int T;
	scanf("%d", &T);
	while(T--)
	{
		int n;
		scanf("%d", &n);
		for(int i = 0; i < n; i++)
			scanf("%lld", &A[i]);
		gauss(A, n);
		LL ans = 0;
		for(int i = 0; i < n; i++)
			ans ^= A[i];
		printf("Case %d: %lld\n", cas++, ans);
	}
	return 0;
}

Light OJ 1272 Maximum Subset Sum 高斯消元 最大XOR值

时间: 2024-08-19 16:15:37

Light OJ 1272 Maximum Subset Sum 高斯消元 最大XOR值的相关文章

【高斯消元解XOR方程】POJ1222-EXTENDED

[题目大意] 有5*6盏灯,每次开/关一个灯,上下左右的灯状态也会反转.问怎么使状态统一? [思路] 典型高斯消元解XOR方程,注意每盏灯要么0次要么1次. 1 #include <iostream> 2 #include <stdio.h> 3 #include <algorithm> 4 #include <set> 5 using namespace std; 6 int a[40][40]; 7 void gauss() 8 { 9 int i,j,

关于高斯消元解决xor问题的总结

我觉得xor这东西特别神奇,最神奇的就是这个性质了 A xor B xor B=A 这样就根本不用在意重复之类的问题了 关于xor的问题大家可以去膜拜莫队的<高斯消元解XOR方程组>,里面写的很详细 我来扯两道bzoj上的例题好了 bzoj2115,求1-N最长xor路径,根据那个神奇的性质,我们先随便找一条1-n的路径作为标准路径 任意一条1-N的路径都等价于标准路径和某些环的xor 怎么找环?很简单,bfs下去,设d[x]表示1到x的一条路径xor值,如果到一条边x-->y时y已经访

【高斯消元解xor方程】BZOJ1923-[Sdoi2010]外星千足虫

[题目大意] 有n个数或为奇数或为偶数,现在进行m次操作,每次取出部分求和,告诉你这几次操作选取的数和它们和的奇偶性.如果通过这m次操作能得到所有数的奇偶性,则输出进行到第n次时即可求出答案:否则输出无法确定. [思路] 高斯消元解xor方程组,求最少需要的方程个数或判断无法确定. 无法确定即存在自由元,在每次操作中找1的时候判断一下就好了:最小方程个数,就是记录下每次找到的最小的1的位置,最后输出最大值即可. [错误] 忘记把ans改为-1了(见程序注释) [备注] P.S.我看别人在高斯消元

POJ 1222 EXTENDED LIGHTS OUT(高斯消元解XOR方程组)

http://poj.org/problem?id=1222 题意:现在有5*6的开关,1表示亮,0表示灭,按下一个开关后,它上下左右的灯泡会改变亮灭状态,要怎么按使得灯泡全部处于灭状态,输出方案,1表示按,0表示不按. 思路:每个开关最多只按一次,因为按了2次之后,就会抵消了. 可以从结果出发,也就是全灭状态怎么按能变成初始状态. 用3*3来举个例子,$X\left ( i,j \right )$表示这些开关是按还是不按,那么对于第一个开关,对它有影响的就只有2.4这两个开关,所以它的异或方程

poj1753-Flip Game(高斯消元枚举xor线性方程自由变元的值,找为1解的最少数量)

Flip Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 31227   Accepted: 13583 Description Flip game is played on a rectangular 4x4 field with two-sided pieces placed on each of its 16 squares. One side of each piece is white and the

高斯消元与xor方程组

for(i=1;i<=n;i++) { for(j=i+1;j<=n;j++) if(a[j]>a[i]) swap(a[i],a[j]); if(!a[i]) break; for(j=60;j>=0;j--) if(a[i]>>j&1) { for(k=1;k<=n;k++) if(i!=k && (a[k]>>j&1)) a[k]^=a[i]; break; } } 对着这个代码思(dan)考(teng)了一星期.

BZOJ 1770: [Usaco2009 Nov]lights 燈( 高斯消元 )

高斯消元解xor方程组...暴搜自由元+最优性剪枝 ----------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #include<bitset> using namespace std; const int maxn = 49; int N, Id[max

BZOJ 2844 albus就是要第一个出场 ——高斯消元 线性基

[题目分析] 高斯消元求线性基. 题目本身不难,但是两种维护线性基的方法引起了我的思考. 1 2 3 4 5 6 7 8 9 10 11 12 void gauss(){     k=n;     F(i,1,n){         F(j,i+1,n) if (a[j]>a[i]) swap(a[i],a[j]);         if (!a[i]) {k=i-1; break;}         D(j,30,0) if (a[i]>>j & 1){            

【高斯消元】【异或方程组】【bitset】bzoj1923 [Sdoi2010]外星千足虫

Xor方程组解的个数判定: ——莫涛<高斯消元解Xor方程组> 使用方程个数判定:消去第i个未知数时,都会记录距第i个方程最近的第i位系数不为0の方程是谁,这个的max就是使用方程个数. 使用bitset加速. #include<cstdio> #include<cmath> #include<algorithm> #include<bitset> using namespace std; #define N 1001 #define M 200