P3812 【模板】线性基(求最大值)

题目背景

这是一道模板题。

题目描述

给定n个整数(数字可能重复),求在这些数中选取任意个,使得他们的异或和最大。

输入输出格式

输入格式:

第一行一个数n,表示元素个数

接下来一行n个数

输出格式:

仅一行,表示答案。

输入输出样例

输入样例#1: 复制
2
1 1
输出样例#1: 复制
1

说明

1≤n≤50,0≤Si≤250 1 \leq n \leq 50, 0 \leq S_i \leq 2 ^ {50} 1n50,0Si250

CODE:
 1 #include <bits/stdc++.h>
 2 #define N 51
 3 #define ll long long
 4 using namespace std;
 5 
 6 int n;
 7 ll ans;
 8 ll a[N], p[101];
 9 
10 inline ll read()
11 {
12     char ch = getchar();
13     ll x = 0, f = 1;
14     while(ch > '9' || ch < '0')
15     {
16         if(ch == '-')
17             f = -1;
18         ch = getchar();
19     }
20     while(ch >= '0' && ch <= '9')
21     {
22         x = x * 10 + ch - '0';
23         ch = getchar();
24     }
25     return x * f;
26 }
27 
28 void Get_LB(ll x)
29 {
30     for(int i = 62; i >= 0; i--)
31     {
32         if(!(x >> (ll)i))
33             continue;
34         if(!p[i])
35         {
36             p[i] = x;
37             break;
38         }
39         x ^= p[i];
40     }
41 }
42 
43 int main()
44 {
45     n = read();
46     for(int i = 1; i <= n; i++)
47         Get_LB(a[i] = read());
48       ///  for(int i=0;i<=62;i++)cout<<p[i]<<" ";cout<<endl;
49     for(int i = 62; i >= 0; i--)
50         if((ans ^ p[i]) > ans)
51             ans ^= p[i];
52     cout << ans;
53      return 0;
54 
55 }

猜你喜欢

转载自www.cnblogs.com/zhangbuang/p/11107998.html
今日推荐