博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ4269: 再见Xor(线性基)
阅读量:4622 次
发布时间:2019-06-09

本文共 1383 字,大约阅读时间需要 4 分钟。

Time Limit: 10 Sec  Memory Limit: 512 MB
Submit: 474  Solved: 291
[][][]

Description

给定N个数,你可以在这些数中任意选一些数出来,每个数可以选任意多次,试求出你能选出的数的异或和的最大值和严格次大值。

Input

第一行一个正整数N。
接下来一行N个非负整数。

Output

一行,包含两个数,最大值和次大值。

Sample Input

3
3 5 6

Sample Output

6 5

HINT

100% : N <= 100000, 保证N个数不全是0,而且在int范围内

Source

一眼线性基,取最大值是最基本的操作,就是一路异或过去,能变大就异或

次大值可以由最大值和最小值异或得到

// luogu-judger-enable-o2#include
#include
#include
using namespace std;const int MAXN = 1e5 + 10, B = 31;inline int read() { char c = getchar(); int x = 0, f = 1; while(c < '0' || c > '9') {
if(c == '-') f = -1; c = getchar();} while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar(); return x * f;}int N, P[MAXN];void Insert(int x) { for(int i = B; i >= 0; i--) { if(x >> i) { if(P[i]) x = x ^ P[i]; else {P[i] = x; return ;} } }}int QueryMax() { int ans = 0; for(int i = B; i >= 0; i--) if((ans ^ P[i]) > ans) ans = ans ^ P[i]; return ans;}int QueryMin() { for(int i = 0; i <= B; i++) if(P[i]) return P[i];}main() { #ifdef WIN32 freopen("a.in", "r", stdin);#endif N = read(); for(int i = 1; i <= N; i++) { Insert(read()); } int Mx = QueryMax(), Mn = QueryMin(); printf("%d %d", Mx, Mx ^ Mn);}

 

转载于:https://www.cnblogs.com/zwfymqz/p/9192147.html

你可能感兴趣的文章
SAP 中如何寻找增强
查看>>
spi驱动无法建立spidev问题
查看>>
ANDROID开发之SQLite详解
查看>>
如何依靠代码提高网络性能
查看>>
Zookeeper要安装在奇数个节点,但是为什么?
查看>>
discuz 微社区安装记录
查看>>
[BZOJ4824][Cqoi2017]老C的键盘 树形dp+组合数
查看>>
配置的热更新
查看>>
MySQL事务的开启与提交,autocommit自动提交功能
查看>>
PriorityQueue
查看>>
CODEVS1403 新三国争霸
查看>>
iOS 环信离线推送
查看>>
WPFTookit Chart 高级进阶
查看>>
thulac安装问题
查看>>
你必须知道的.NET Day1
查看>>
vim实现实时自动保存
查看>>
mysql CREATE USER
查看>>
H3C 快速以太网和千兆以太网
查看>>
oracle触发器——ddl触发器
查看>>
oracle函数 SOUNDEX(c1)
查看>>