51nod 1312 最大异或和(线性基)

线性gay - -

分析:要求和尽量大,首先可以想到,求完线性基后,记最大异或为Max,对于线性基以外的数,都可以变成Max,剩下的线性无关,变成最小线性基,可以通过异或基中最大的数把所有的最高位变成1,这样显然是最优的,然后把最大的数异或成Max,去掉这个数后再考虑剩下的数,以此类推,相当于最大的数取Max,其它的取Max ^ 自己,加起来就是答案。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 const int maxn = 55;
 6 typedef long long ll;
 7 struct LinearGay{
 8     ll a[64], have;
 9     int n, high_bit;
10     LinearGay(){
11         memset(a, 0, sizeof(a));
12         n = have = high_bit = 0;
13     }
14     void insert(ll x){
15         int d = 63;
16         while(x && d >= 0){
17             if(x & (1LL << d)){
18                 if(a[d]){
19                     x ^= a[d];
20                 }
21                 else{
22                     a[d] = x;
23                     high_bit = max(d, high_bit);
24                     n++;
25                     break;
26                 }
27             }
28             d--;
29         }
30     }
31     void Minimize(){
32         for(int i = 63; i >= 0; i--){
33             if(!a[i])continue;
34             for(int j = i - 1; j >=0; j--){
35                 if(!a[j])continue;
36                 a[i] = min(a[i], a[i] ^ a[j]);
37             }
38         }
39     }
40     ll MaxXor(){
41         Minimize();
42         ll res = 0;
43         for(int i = 63; i >= 0; i--){
44             if(a[i])res ^= a[i];
45         }
46         return res;
47     }
48 }lb;
49 int main(){
50 //    freopen("e:\\in.txt","r",stdin);
51     int n;
52     cin>>n;
53     ll a;
54     for(int i = 0; i < n; i++){
55         cin>>a;
56         lb.insert(a);
57     }
58     ll Max = lb.MaxXor();
59     ll ans = 0;
60     for(int i = 0; i < lb.high_bit; i++){
61         if(lb.a[i])ans += Max ^ lb.a[i];
62     }
63     ans += (n - lb.n + 1) * Max;
64     cout<<ans<<endl;
65     return 0;
66 }
时间: 2024-08-30 12:01:36

51nod 1312 最大异或和(线性基)的相关文章

51nod 1577 异或凑数(线性基)

分析:如果能知道区间线性基,问题就解决了,所以一开始有个naive的想法,搞个线性基线段树,然而复杂度(32*nlogn),果断T... 正解是预处理后缀线性基,并且每个基中的每一个分量位置尽量靠前,然后把k丢到左端点对应的线性基里跑,如果k最后不为0或者需要异或的位置超过了r,答案就是NO. 这样的后缀线性基可以从后面开始处理,插入x时,如果某一位已经有数且在数组中的位置在x之后,把x放入线性基替换掉这个数,然后用这个数接着跑. 1 #include<iostream> 2 #include

51nod 1577 异或凑数 线性基的妙用

\(OTZgengyf\)..当场被吊打\(QwQ\) 思路:线性基 提交:\(3\)次 错因:往里面加数时\(tmp.p\)与\(i\)区分不清(还是我太菜了) 题解: 我们对每个位置的线性基如此操作: 对于每一位,保存尽量靠后的数: 所以每一位还要记录位置. (后文区分"位"(二进制位)和"位置"(原数组中的第几位),每个位置都有\(30\)位) 具体来说,就是从高位向低位扫,如果我们当前的数能被放入某一位,如果这一位没有数,则直接放入:否则比较出现位置,如果当

【XSY2701】异或图 线性基 容斥原理

题目描述 定义两个图\(G_1\)与\(G_2\)的异或图为一个图\(G\),其中图\(G\)的每条边在\(G_1\)与\(G_2\)中出现次数和为\(1\). 给你\(m\)个图,问你这\(m\)个图组成的集合有多少个子集的异或图为一个连通图. \(n\leq 10,m\leq 60\) 题解 考虑枚举图的子集划分,让被划分到不同子集的点之间没有连边,而在同一个子集里面的点可以连通,可以不连通. 可以用高斯消元(线性基)得到满足条件的图的个数.设枚举的子集划分有\(k\)个集合,那么容斥系数就

[JLOI2015]装备购买(线性基)

[JLOI2015]装备购买 题目描述 脸哥最近在玩一款神奇的游戏,这个游戏里有 nn 件装备,每件装备有 \(m\) 个属性,用向量 \(\mathbf{z_i}\)=\((a_1, \ldots ,a_j, \ldots , a_m)\) 表示 \(1 \leq i \leq n\), \(1 \leq j \leq m\),每个装备需要花费 \(c_i\) ,现在脸哥想买一些装备,但是脸哥很穷,所以总是盘算着怎样才能花尽量少的钱买尽量多的装备.对于脸哥来说,如果一件装备的属性能用购买的其他

线性基专题总结

莫(tui)名(wan)其(ti)妙(jie)又弄完了一个专题? 刚开始以为这个知识点出题都是板子来着,后来做题才发现我太天真了啊 先列知识点吧 1.性质 (1). ?原序列异或能得到的所有数都可以由线性基中的一些数异或得到 (2).?线性基里面的任意一些数异或起来都不能得到 \(0\) (3).?线性基里面的数的个数唯一,并且在保持性质一的前提下,数的个数是最少的 (4).?若线性基中有k个元素,则原序列异或能得到的数一共有 \(2^k\) 种,每种有 \(2^{n-k}\) 个 (5).?线

【BZOJ2115】【Wc2011】 Xor 线性基 异或最长路

#include <stdio.h> int main() { puts("转载请注明出处谢谢"); puts("http://blog.csdn.net/vmurder/article/details/43410545"); } 题意:找一条异或最长路. 题解:先随便来一条路径,然后我们发现这条路径上可以随便加简单环(不管有没有共点共边). 就是因为可以先从某点走到环上来一圈再走回来,这样来去的路径被搞没了,简直污得不行. 然后我们可以用线性基来决定去

Codeforces 895C Square Subsets(状压DP 或 异或线性基)

题目链接  Square Subsets 这是白书原题啊 先考虑状压DP的做法 2到70总共19个质数,所以考虑状态压缩. 因为数据范围是70,那么我们统计出2到70的每个数的个数然后从2考虑到70. 设dp[x][mask]为考虑到x这个数的时候,x这个数和之前的所有数中,选出某些数,他们的乘积分解质因数,所有的指数对2取模之后, 状态为mask的方案数. 然后就可以转移了……这个状压DP花了我好几个小时……真是弱啊 哦对最后还要特判1的情况. 每个1选或不选都可以,然后考虑只选1的情况,累加

2017 ACM-ICPC Asia Xi&#39;an Problem A XOR(异或线性基 )

题目链接  2017西安赛区 Problem A 题意  给定一个数列,和$q$个询问,每个询问中我们可以在区间$[L, R]$中选出一些数. 假设我们选出来的这个数列为$A[i_{1}]$, $A[i_{2}]$, ..., $A[i_{t}]$ 求$K$ $or$ $($$A[i_{1}]$ $xor$ $A[i_{2}]$ ... $xor$ $A[i_{t}]$$)$的最大值 首先常规操作,每次在线段树上求出区间$[L, R]$代表的线性基. 然后把这个线性基中所有$K$的二进制表示为$

bzoj2115 [Wc2011] Xor——高斯消元 &amp; 异或线性基

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2115 异或两次同一段路径的权值,就相当于没有走这段路径: 由此可以得到启发,对于不同的走法,也许只需要找出一些东西,就可以把所有的走法用它们来异或表示出来: 再关注图上的环路,因为从 1 到 n 的不同路径也可以看作是经由 1 和 n 连接的环路,路径上也可能有环路: 发现对于环路的不同走法,就是把路与环的权值异或求最优值,重叠的部分异或了两次相当于不走: 于是问题转化为找出图上的所有环(