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} 1≤n≤50,0≤Si?≤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 }

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

时间: 2024-08-30 15:35:21

P3812 【模板】线性基(求最大值)的相关文章

[P3812][模板]线性基

解题关键:求异或最大值.线性基模板题. 极大线性无关组的概念. 异或的值域相同. #include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> #include<iostream> #include<cmath> using namespace std; typedef long long ll; const int MAX_BASE=63; ll b

【模板】线性基求交

线性基求交 struct lb{ ll p[63]; lb(){ memset(p,0,sizeof(p)); } void clear(){ memset(p,0,sizeof(p)); } void ins(ll x){ for(int i=60;i>=0;i--) if((x>>i)&1){ if(!p[i]){ p[i]=x; return; }else x^=p[i]; } } }; lb merge(lb a,lb b){ lb g=lb(),tmp=a; ll cu

hdu3949(线性基,求第k小的异或和

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3949 XOR Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4731    Accepted Submission(s): 1658 Problem Description XOR is a kind of bit operator, we

[hdu3949]XOR(线性基求xor第k小)

题目大意:求xor所有值的第k小,线性基模板题. #include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> #include<iostream> #include<cmath> using namespace std; typedef long long ll; const int MAX_BASE=63; ll base[64],a[10006]

[模板]线性基

用途 处理关于子集的异或和的问题,比如子集异或和的最大值,或者能不能异或出某个数 原理 从一堆数中处理出一组线性无关(?)的数,使得这些数能异或出的数和原来能异或出的数相同 线性基中,以每个位置为最高位1的数(最多)只有一个,这样就保证了线性无关 做法 依次处理每个数,对于x,从大到小扫描它的每一位,当扫到第i位为1时: 若线性基中没有最高位为i的数,则把x插到线性基中,结束扫描 若有,则把x异或上那个数,继续做 这样做,如果一个数最终没有被插入线性基中,证明它已经能被线性基中的数表示 而插到线

[算法模板]线性基

线性基 GavinZheng敲懒的... menci大佬的线性基博客 模板代码引自menci: struct LinearBasis { long long a[MAXL + 1]; LinearBasis() { std::fill(a, a + MAXL + 1, 0); } LinearBasis(long long *x, int n) { build(x, n); } void insert(long long t) { for (int j = MAXL; j >= 0; j--)

线性基求交板子

_ operator + (const _ &rhs) const { _ ret; unsigned p[32]{}, f[32]{}; REP(i,0,31) p[i] = a[i]; PER(i,0,31) { auto x = rhs.a[i], y = 1u<<i; PER(j,0,31) if (x>>j&1) { if (p[j]) x^=p[j],y^=f[j]; else { p[j]=x,f[j]=y; break; } } if (x==0)

线性基初探

关于线性基的学习与理解 1.线性基: 若干数的线性基是一组数\(a_1,a_2,...a_n\)其中\(a_x\)的最高位的1在第x位. 通过线性基中元素\(xor\)出的数的值域与原来的数\(xor\)出数的值域相同. 2.线性基的构造法: 对每一个数\(p\)从高位到低位扫,扫到第\(x\)位为1时,若\(a_x\)不存在,则\(a_x=p\)并结束此数的扫描,否则令\(p=pxora_x\). 3.查询: 用线性基求这组数\(xor\)出的最大值:从高往低扫\(a_x\),若异或上\(a_

【线段树分治 线性基】luoguP3733 [HAOI2017]八纵八横

不知道为什么bzoj没有HAOI2017 题目描述 Anihc国有n个城市,这n个城市从1~n编号,1号城市为首都.城市间初始时有m条高速公路,每条高速公路都有一个非负整数的经济影响因子,每条高速公路的两端都是城市(可能两端是同一个城市),保证任意两个城市都可以通过高速公路互达. 国正在筹划“八纵八横”的高铁建设计划,计划要修建一些高速铁路,每条高速铁路两端也都是城市(可能两端是同一个城市),也都有一个非负整数的经济影响因子.国家还计划在“八纵八横”计划建成之后,将“一带一路”扩展为“一带_路一