4269: 再见Xor

Time Limit: 10 Sec  Memory Limit: 512 MB
Submit: 176  Solved: 107
[Submit][Status][Discuss]

Description

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

Input

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

Output

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

Sample Input

3
3 5 6

Sample Output

6 5
 
 
 
【题解】
这算是一道高斯消元求线性基的模板题,我尽量讲得详细点。
 
首先把每个数拆成二进制的形式,用矩阵表示。
 
如样例:
 
    0 1 1
    1 0 1
    1 1 0
 
然后高斯消元:
 
    0 1 1  交换前2行     1 0 1  处理2和3行    1 0 1    处理第3行        1 0 1
    1 0 1    =======>   0 1 1   ========>  0 1 1   =======>   0 1 1
    1 1 0             1 1 0            0 1 1          0 0 0
 
此时只能保证第二行二进制第二位为1,记录temp=2
 
然后把矩阵的前temp行求异或和,就是最大值ans,然后ans^a[temp]就是次大值。
 
可以yy一下,或者自己动手推推。
 
 
 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<algorithm>
using namespace std;
#define MAXN 100010
int n,ans,a[MAXN];
inline int read()
{
int x=,f=; char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-; ch=getchar();}
while(isdigit(ch)) {x=x*+ch-''; ch=getchar();}
return x*f;
}
void guess()
{
int temp=;
for(int i=(<<),j;i;i>>=)//枚举2进制每一位
{
for(j=temp+;j<=n;j++) if(a[j]&i) break;//找到当前二进制位上是1的第一个数
if(j>n) continue;//找不到,继续
swap(a[++temp],a[j]);//高斯消元固有的
for(int j=;j<=n;j++) if(j!=temp&&(a[j]&i)) a[j]^=a[temp];//处理其他行
}
for(int i=;i<=temp;i++) ans^=a[i];
printf("%d %d\n",ans,ans^a[temp]);
}
int main()
{
//freopen("cin.in","r",stdin);
//freopen("cout.out","w",stdout);
n=read();
for(int i=;i<=n;i++) a[i]=read();
guess();
return ;
}
 
 
 

最新文章

  1. CSS系列:CSS常用样式
  2. Linux下history命令用法
  3. PHP计算一年有多少周,每周开始日期和结束日期
  4. redis参数优化
  5. PHP 数组排序
  6. app缓存设计-文件缓存
  7. 第三百五十九天 how can I 坚持
  8. php版DES
  9. OFBiz进阶之HelloWorld(三)CRUD操作
  10. [简历] JAVA 软件工程师
  11. 使用bower init创建bower.json文件
  12. 记录Mac下安装pyenv时所遇到的问题
  13. Gym100971B Gym100971C Gym100971F Gym100971G Gym100971K Gym100971L(都是好写的题。。。) IX Samara Regional Intercollegiate Programming Contest Russia, Samara, March 13, 2016
  14. Java中获取文件路径
  15. 【Luogu3455】【POI2007】ZAP-Queries(莫比乌斯反演)
  16. c 存储类型
  17. Python就业指导
  18. 关于sql注入漏洞的挖掘及渗透工具简介
  19. mysql 8.0 ~ 存储和账户
  20. Android:如何生成自己的keystore(zz)

热门文章

  1. 基于tcp协议的粘包问题(subprocess、struct)
  2. header(&quot;Location:http://www.baidu.com&quot;);
  3. [转载] ffmpeg Windows下采集摄像头一帧数据,并保存为bmp图片
  4. Oracle临时表和SQL Server临时表的不同点对比
  5. JUnit4学习
  6. 转JMeter 利用Jmeter批量数据库插入数据
  7. Elasticsearch聚合优化 | 聚合速度提升5倍
  8. composer 详解
  9. Python3中的http.client模块
  10. EMI (电磁干扰)