码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-06-29 22:13:26      阅读:108      评论:0      收藏:0      [点我收藏+]

标签:int   getch   tom   重复   msu   tin   copy   math   font   

题目背景

这是一道模板题。

题目描述

给定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,0Si?250

 

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 }

 

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

标签:int   getch   tom   重复   msu   tin   copy   math   font   

原文地址:https://www.cnblogs.com/zhangbuang/p/11107998.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!