【BZOJ 4269】再见Xor

zky学长提供的线性基求法:

for(int i=1;i<=n;i++)
for(int j=64;j>=1;j--)
{
    if(a[i]>>(j-1)&1)
    {
        if(!lb[j]){lb[j]=a[i];break;}
        else a[i]^=lb[j];
    }
}

Gauss消元求线性基的方法:

#include<cstdio>
#include<cstring>
#include<algorithm>
#define read(x) x=getint()
using namespace std;
const int N = 100003;
int getint() {
	int k = 0, fh = 1; char c = getchar();
	for(; c < ‘0‘ || c > ‘9‘; c = getchar())
		if (c == ‘-‘) fh = -1;
	for(; c >= ‘0‘ && c <= ‘9‘; c = getchar())
		k = (k << 1) + (k << 3) + c - ‘0‘;
	return k * fh;
}
int n, a[N];
void Gauss() {
	int tmp = 0, i;
	for(int j = 1 << 30; j; j >>= 1) {
		for(i = tmp + 1; i <= n; ++i)
			if (a[i] & j)
				break;
		if (i > n) continue;
		swap(a[++tmp], a[i]);
		for(i = 1; i <= n; ++i)
			if (i != tmp && a[i] & j)
				a[i] ^= a[tmp];
	}
	n = tmp;
}
int main() {
	read(n);
	for(int i = 1; i <= n; ++i)
		read(a[i]);
	Gauss();
	int ans = 0;
	for(int i = 1; i <= n ;++i)
		ans ^= a[i];
	printf("%d %d\n", ans, ans ^ a[n]);
	return 0;
}

没了

时间: 2024-10-07 05:07:15

【BZOJ 4269】再见Xor的相关文章

BZOJ 4269: 再见Xor

4269: 再见Xor Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 265  Solved: 159[Submit][Status][Discuss] Description 给定N个数,你可以在这些数中任意选一些数出来,每个数可以选任意多次,试求出你能选出的数的异或和的最大值和严格次大值. Input 第一行一个正整数N. 接下来一行N个非负整数. Output 一行,包含两个数,最大值和次大值. Sample Input 3 3 5 6 S

bzoj 4269 再见Xor 线性基

题面 题目传送门 解法 第一问就是线性基的裸题 第二问也很类似,从低位向高位枚举,如果线性基上这一位有数,那么直接异或后返回 时间复杂度:\(O(n\ log\ a_i)\) 代码 #include <bits/stdc++.h> #define int long long using namespace std; template <typename node> void chkmax(node &x, node y) {x = max(x, y);} template

4269: 再见Xor

4269: 再见Xor 链接 分析: 和SGU 275唯一不同的就是需要求出次小值,那么异或出最大值的所有元素中,找到最小的,去除即可. 代码: 1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long LL; 4 5 const int N = 100000 + 10; 6 const int m = 30; 7 LL a[N],b[N]; 8 int n; 9 10 void build() { 11 for

【BZOJ4269】再见Xor 高斯消元

[BZOJ4269]再见Xor Description 给定N个数,你可以在这些数中任意选一些数出来,每个数可以选任意多次,试求出你能选出的数的异或和的最大值和严格次大值. Input 第一行一个正整数N. 接下来一行N个非负整数. Output 一行,包含两个数,最大值和次大值. Sample Input 3 3 5 6 Sample Output 6 5 HINT 100% : N <= 100000, 保证N个数不全是0,而且在int范围内 题解:大水~ 在线性基上贪心得到最大值,用最大值

bzoj 2337: [HNOI2011]XOR和路径

Description Input Output Sample Input Sample Output HINT Source Day2 终于把这个史前遗留的坑给填了... 首先异或的话由位无关性,可以按位处理... 那么对于每一位,设f[i]表示从i出发第一次到达n且xor和为1的概率,out[i]为i的出边,那么转移就比较容易了... if(w(i,j)&xxx) f[i]+=(1-f[j)/out[i];// 这条边该位为1,需要xor上0,xor和才为1 else f[i]+=f[j]/

【概率DP/高斯消元】BZOJ 2337:[HNOI2011]XOR和路径

2337: [HNOI2011]XOR和路径 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 682  Solved: 384[Submit][Status][Discuss] Description 几乎是一路看题解过来了.. 拖了一个星期的题目- - 已然不会概率DP(说得好像什么时候会过一样),高斯消元(打一次copy一遍). 发现异或题目的新解决方法:按位处理.. 发现DP新方法:高斯消元. f[k][i]代表第k位权值起点为i到终点时答案

bzoj 2115: [Wc2011] Xor xor高斯消元

2115: [Wc2011] Xor Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 797  Solved: 375[Submit][Status] Description Input 第一行包含两个整数N和 M, 表示该无向图中点的数目与边的数目. 接下来M 行描述 M 条边,每行三个整数Si,Ti ,Di,表示 Si 与Ti之间存在 一条权值为 Di的无向边. 图中可能有重边或自环. Output 仅包含一个整数,表示最大的XOR和(十进制结

BZOJ 2115: [Wc2011] Xor [高斯消元XOR 线性基 图]

啦啦啦 题意: N 个点M条边的边带权的无向图,求1到n一条XOR和最大的路径 感觉把学的东西都用上了.... 1到n的所有路径可以由一条1到n的简单路径异或上任意个简单环得到 证明: 如果环与路径有交,异或后那块交就没了,相当于那块走了环上的路径: 如果环与路径没交,就是走到环上走一圈在回来,一去一回其他的地方又没了. 求一棵生成树,然后每一条非树边构成一个环,一共$m-n+1$个环 然后答案就是任取一些环的异或和与1到n路径异或和异或的最大值啦 实现上注意: 1.求生成树和简单环的异或和一遍

BZOJ 2115: [Wc2011] Xor 线性基

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2115 解法: 膜:http://www.cnblogs.com/ljh2000-jump/p/5869925.html 这道题要求从1到n的最大xor和路径,存在重边,允许经过重复点.重复边.那么在图上作图尝试之后就会发现,路径一定是由许多的环和一条从1到n的路径组成.容易发现,来回走是没有任何意义的,因为来回走意味着抵消.考虑这道题求得是路径xor和最大,所以必然我们要想办法处理环的情