您的位置:首页 > 其它

P3812 【模板】线性基

2019-07-23 12:12 76 查看

题目链接

  线性基可以解决的问题:给定n个整数(数字可能重复),求在这些数中选取任意个,使得他们的异或和最大。

  然后这道题也是一道模板题了。

  什么是线性基呢?就是一个去求解异或和最值的问题,为什么可以求异或和最大呢,这里需要用到了异或的性质了。

a ^ b = c则有a ^ c = b以及a ^ b = c。

所以我们距离9、10、12、11这三个按序输入的数值,我们求取其中几个元素的异或值最大。

我们用p[ ]来存首字符的问题。p[3]、p[2]、p[1]、p[0]分别代表的是8、4、2、1这几位上如果要放上去值的时候对应的值(已经异或前面的所有的元素所得到的)。

p[3] = 9,是因为9是"1001"那么第3位就是1;

p[1] = 3,因为我们把10处理进来时候,10会先异或前面的9,变成3,然后(3>>2 == 0),所以p[1] = 3;

p[2] = 5,把12丢进去的时候,12会异或前面的p[3]变成了5,然后(5>>2 == 1)是存在的,故是p[2] = 5;

p[0] = 4,把11丢进去,会先后异或9、5、3最后得到的就是4了,那么是不是就是11异或完前面所有的元素的值了。

  然后我们要是想去这段区间的最大值,是不是就是我们先把第一个9取了,然后发现9^5 = 12也就是12了,更新答案为12,然后12^3 = 15,更新答案为15,15 ^ 4 = 11,没有比之前更大,我们以此类推是不是就可以把完整的给求出来了。

[code]#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <limits>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#define lowbit(x) ( x&(-x) )
#define pi 3.141592653589793
#define e 2.718281828459045
#define efs 1e-6
#define INF 0x3f3f3f3f
#define HalF (l + r)>>1
#define lsn rt<<1
#define rsn rt<<1|1
#define Lson lsn, l, mid
#define Rson rsn, mid+1, r
#define QL Lson, ql, qr
#define QR Rson, ql, qr
#define myself rt, l, r
#define MAX_3(a, b, c) max(max(a, b), c)
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
const int maxN = 55;
int N;
ll a[maxN], p[maxN];
inline void LB(ll x)
{
for(int i=50; i>=0; i--)
{
if( !( x >> (ll)i ) ) continue;
if(!p[i])
{
p[i] = x;
return;
}
x ^= p[i];
}
}
inline void init()
{
memset(p, 0, sizeof(p));
}
int main()
{
scanf("%d", &N);
init();
for(int i=1; i<=N; i++)
{
scanf("%lld", &a[i]);
LB(a[i]);
}
ll ans = 0;
for(int i=50; i>=0; i--)
{
if((ans ^ p[i]) > ans) ans = ans ^ p[i];
}
printf("%lld\n", ans);
return 0;
}

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: