To xor or not to xor SGU - 275

本文介绍了一个使用线性基求解异或最大值的问题,并提供了完整的C++代码实现。通过高斯消元法构造线性基,进而求得给定数值集合中两两元素异或操作的最大可能值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

To xor or not to xor

SGU - 275

线性基求异或最大值~

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define LL  long long
 4 const int maxn = 110;
 5 LL a[maxn], Bin[maxn];
 6 int now;
 7 void init(){
 8     Bin[0] = 1;
 9     for(int i = 1; i <= 61; i++) Bin[i] = Bin[i-1] << 1;
10 }
11 
12 void gauss(int n){
13     now = 1;
14     for(int i = 61; i >= 0; i--) {
15         int j = now;
16         while(j <= n && !(a[j] & Bin[i])) j++;
17         if(j == n+1) continue;
18         if(j != now) swap(a[j], a[now]);
19         for(int k = 1; k <= n; k++) if(k != now){
20             if(a[k] & Bin[i]) a[k] ^= a[now];
21         }
22         now++;
23     }
24     now--;
25 }
26 
27 LL query(){
28     LL ans = 0;
29     for(int i = 1; i <= now; i++) ans ^= a[i];
30     return ans;
31 }
32 
33  
34 int main(){
35     init();
36     int n;
37     scanf("%d", &n);
38     for(int i = 1;  i <= n; i++) scanf("%lld", &a[i]);
39     gauss(n);
40     printf("%lld\n", query());
41 }
View Code

 

转载于:https://www.cnblogs.com/yijiull/p/7707863.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值