题解

很显然我们求出一组线性基来,如果有M个基,那么可以构造N - M + 1个最大异或值

而对于线性基中的元素,除了最大的元素,我们用最大异或值异或掉每个元素累加进答案

而不是把线性基中的元素处理成一个下三角矩阵!

代码

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <vector>
#include <set>
#define enter putchar('\n')
#define space putchar(' ')
#define MAXN 1000005
//#define ivorysi
#define pb push_back
#define mo 1000007
#define pii pair<int,int>
#define mp make_pair
using namespace std;
typedef long long int64;
template<class T>
void read(T &res) {
res = 0;char c = getchar();T f = 1;
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 - '0' + c;
c = getchar();
}
res = res * f;
}
template<class T>
void out(T x) {
if(x < 0) {x = -x;putchar('-');}
if(x >= 10) out(x / 10);
putchar('0' + x % 10);
} int N;
int64 a[60],b[60];
bool vis[60],has[60];
void Solve() {
read(N);
for(int i = 1 ; i <= N ; ++i) {
read(a[i]);
for(int j = 55 ; j >= 0 ; --j) {
if(a[i] >> j & 1) {
if(b[j]) a[i] ^= b[j];
else {
has[j] = 1;
b[j] = a[i];vis[i] = 1;
for(int k = 0 ; k < j ; ++k) if(b[j] >> k & 1) b[j] ^= b[k];
for(int k = j + 1 ; k <= 55 ; ++k) if(b[k] && (b[k] >> j & 1)) b[k] ^= b[j];
break;
}
}
}
}
int64 ans = 0;
for(int i = 1 ; i <= N ; ++i) {
if(!vis[i]) {
for(int j = 55 ; j >= 0 ; --j) {
if(!(a[i] >> j & 1)) a[i] ^= b[j];
}
ans += a[i];
}
}
int64 t = 0;
for(int i = 55 ; i >= 0 ; --i) {
if(has[i]) {
for(int j = 0 ; j <= 55 ; ++j) t ^= b[j];
has[i] = 0;
break;
}
}
ans += t;
for(int i = 55 ; i >= 0 ; --i) {
if(has[i]) ans += t ^ b[i];
}
out(ans);enter;
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Solve();
}

最新文章

  1. 学习笔记:HTML5 Canvas绘制简单图形
  2. Server 2003序列号
  3. [BTS] BizTalk EDI AS2 Error 1
  4. linux设备驱动归纳总结(一)内核的相关基础概念【转】
  5. livevent的几个问题
  6. 在JSP页面中调用另一个JSP页面中的变量
  7. 《python基础教程》笔记之 更加抽象
  8. Android 常用 adb 命令总结
  9. javascript笔记整理(正则)
  10. CSS——float属性备忘笔记
  11. PHP Html 弹窗,本页面弹窗子页面
  12. mysql替换字段里数据内容部分字符串(亦可用于增加字段中的内容)
  13. PowerCmd(转)
  14. 实现Asp.net Mvc分布式Session Redis群集
  15. linux中找不到/etc/sysconfig/iptables
  16. ubuntu 双网卡建网桥脚本实现
  17. [LeetCode] 4. 寻找两个有序数组的中位数
  18. Linux并发与同步专题 (2)spinlock
  19. poj 3080 Blue Jeans (暴力枚举子串+kmp)
  20. 简单的基于矩阵分解的推荐算法-PMF, NMF

热门文章

  1. jQuery读取KindEditor的值
  2. 安装VisualSVN Server 报错The specified TCP port is occupied
  3. 洛谷P2766 最长递增子序列问题
  4. HBase基本概念
  5. 为什么JavaScript声明变量的时候鼓励加var关键字
  6. 推荐一款超级漂亮的HTML5 CSS3的图片轮播器
  7. 【译】第五篇 Replication:事务复制-How it works
  8. Python的类变量和成员变量、类静态方法和类成员方法
  9. 移动开发关于APN的知识整理
  10. WCF REST 工作总结