[LOJ#113]最大异或和

试题描述

这是一道模板题。

给由 n 个数组成的一个可重集 S,求一个集合 T?S,使 T1 xor T2 xor … xor T|T| 最大

输入

第一行一个数 n。
第二行 n 个数,表示集合 S。

输出

T1 xor T2 xor … xor T|T| 的最大值。

输入示例

3
5 2 8

输出示例

15

数据规模及约定

1≤n≤50,0≤S?i??≤2?50??

题解

练一下线性基模板。

果然打错了好多地方。。。

首先在插入一个元素的时候,要注意只有最高位是 1 并且这个 1 在当前位的时候才尝试插入。

然后在最终算答案时,要从高位向地位枚举。。。

线性基的各种性质可以去 http://blog.csdn.net/qaq__qaq/article/details/53812883 学习一下。

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <algorithm>
using namespace std;
#define LL long long

const int BufferSize = 1 << 16;
char buffer[BufferSize], *Head, *Tail;
inline char Getchar() {
	if(Head == Tail) {
		int l = fread(buffer, 1, BufferSize, stdin);
		Tail = (Head = buffer) + l;
	}
	return *Head++;
}
LL read() {
	LL x = 0, f = 1; char c = Getchar();
	while(!isdigit(c)){ if(c == ‘-‘) f = -1; c = Getchar(); }
	while(isdigit(c)){ x = x * 10 + c - ‘0‘; c = Getchar(); }
	return x * f;
}

#define maxn 55

int n;
LL bit[maxn];

int main() {
	n = read();
	for(int i = 1; i <= n; i++) {
		LL a = read();
		for(int j = maxn - 1; j; j--) if(a >> j-1 & 1) {
			if(!bit[j]){ bit[j] = a; break; }
			else a ^= bit[j];
		}
	}

	LL ans = 0;
	for(int i = maxn - 1; i; i--) if((ans ^ bit[i]) > ans) ans ^= bit[i];
	printf("%lld\n", ans);

	return 0;
}

我真是太 zz 了。。。

时间: 2024-10-11 07:34:42

[LOJ#113]最大异或和的相关文章

LibreOJ #113. 最大异或和

二次联通门 : LibreOJ #113. 最大异或和 /* LibreOJ #113. 最大异或和 线性基 插入 与 查询最大值 说一下我在学习线性基时遇到的一些问题 1.线性基指的是一个数集 2....没了. 一开始反复看了好几遍,不知道线性基是个什么东西 后来突然明白是个数集而不是个操作什么的.. 突然不能用printf了...用printf输出就是负数.. 只能用cout了.. */ #include <iostream> #include <cstring> #inclu

[LOJ#114]k 大异或和

试题描述 这是一道模板题. 给由 n 个数组成的一个可重集 S,每次给定一个数 k,求一个集合 T?S,使得集合 T 在 S 的所有非空子集的不同的异或和中,其异或和 T1 xor T2 xor - xor T|T| 是第 k 小的. 输入 第一行一个数 n.第二行 n 个数,表示集合 S.第三行一个数 m,表示询问次数.第四行 m 个数,表示每一次询问的 k. 输出 输出 m 行,对应每一次询问的答案,第 k 小的异或和.如果集合 S 的所有非空子集中,不同的异或和数量不足 k,输出 -1.

【GDKOI2016Day1T1-魔卡少女】【拆位】线段树维护区间内所有连续子区间的异或和

题意:给出N个数,M个操作.操作有修改和询问两种,每次修改将一个数改成另一个数,每次询问一个区间的所有连续子区间的异或和.n,m<=100000,ai<=1000 题解: 当年(其实也就是今年)做不出来的题..D1T1啊... 因为ai<=1000,我们可以拆位处理.拆成10个二进制位,每位开1棵线段树. 对于每个节点,维护: d:这段区间的异或和 L[0],L[1]:子区间一定从左端点开始,异或和为0,1的子区间分别有多少个 R[0],R[1]:子区间一定从右端点开始,异或和为0,1的

SWUST OJ 东6宿舍灵异事件(0322)

东6宿舍灵异事件(0322) Time limit(ms): 1000 Memory limit(kb): 65535 Submission: 88 Accepted: 31 Description 将军听说最近东6闹鬼了,作为一个无神论者,将军当然不相信.但是这个传言已经泛滥了,许多人都在说这个事情,将军从每个人那里听到一个传言,将军可以容易的就知道这个传言是真还是假,但是当一大堆消息组合起来,将军就不知道了,所以将军就找到了你. 提供两种组合方式: A&B:代表A和B都为真的时候,A和B组合

bzoj 2466 异或方程组

对于每个灯,我们用一个变量表示其决策,xu=0表示不选,xu=1表示选.因为每个灯最后必须都亮,所以每个等都对应一个异或方程. 解这个异或方程组,有几种情况: 1.存在唯一解(得到的上三角系数矩阵的主对角线上的元素全部为1) 2.存在v个自由元(即主对角线上有v个0) 我们枚举每个自由元的取值,有2v种情况,每种情况又分为 2.1.合法 2.2.不合法 (出现除以0的情况) 我们统计所有合法解的最小的值作为答案. 1 /**************************************

Trie树/字典树题目(2017今日头条笔试题:异或)

1 /* 2 本程序说明: 3 4 [编程题] 异或 5 时间限制:1秒 6 空间限制:32768K 7 给定整数m以及n各数字A1,A2,..An,将数列A中所有元素两两异或,共能得到n(n-1)/2个结果,请求出这些结果中大于m的有多少个. 8 输入描述: 9 第一行包含两个整数n,m. 10 11 第二行给出n个整数A1,A2,...,An. 12 13 数据范围 14 15 对于30%的数据,1 <= n, m <= 1000 16 17 对于100%的数据,1 <= n, m,

关于触发器捕获数据异动

1 -- ============================================= 2 -- Author: <华仔> 3 -- Create date: <2016,5,20> 4 -- Description: <元宝&分数异动日志> 5 -- 维护日志: 6 -- ============================================= 7 ALTER TRIGGER [dbo].[trGameScoreInfo_Cha

[hdu5416 CRB and Tree]树上路径异或和,dfs

题意:给一棵树,每条边有一个权值,求满足u到v的路径上的异或和为s的(u,v)点对数 思路:计a到b的异或和为f(a,b),则f(a,b)=f(a,root)^f(b,root).考虑dfs,一边计算当前点到根的f值,用一个数组记录当前遍历过的点中到根的异或值为i的点的个数,那么答案可以O(1)算出来,更新也是O(1)的. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32

Luogu P3320 [SDOI2015]寻宝游戏 / 异象石 【LCA/set】

期末考试结束祭! 在期末考试前最后一发的测试中,异象石作为第二道题目出现QAQ.虽然知道是LCA图论,但还是敲不出来QAQ. 花了两天竞赛课的时间搞懂(逃 异象石(stone.pas/c/cpp)题目描述Adera 是 Microsoft 应用商店中的一款解谜游戏.异象石是进入 Adera 中异时空的引导物,在 Adera 的异时空中有一张地图.这张地图上有 N 个点,有 N-1 条双向边把它们连通起来.起初地图上没有任何异象石,在接下来的 M个时刻中,每个时刻会发生以下三种类型的事件之一:1.