luogu3812 線性基模板
http://www.elijahqi.win/archives/1683題目背景
這是一道模板題。
題目描述
給定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≤S
i
≤2
50
由於這題只求最大子集的異或值 那麼為了方便簡單 我們可以採用 只求出上三角的線性基
然後判斷能否使我的答案異或值變得更優如果可以就假如否則就不加入
#include<cmath>
#include<cstdio>
#include<algorithm>
using namespace std;
long long a[55],p[55];
int n;
inline bool cmp(long long a,long long b){
return a>b;
}
int main(){
// freopen("a.in","r",stdin);
scanf("%d",&n);long long M=0;
for (int i=1;i<=n;++i) scanf("%lld",&a[i]),M=max(M,a[i]);
int len=log2(M);
for (int i=1;i<=n;++i){
for (int j=len;j>=0;--j){
if (!(a[i]>>j)) continue;
if (!p[j]){p[j]=a[i];break;}
a[i]^=p[j];
}
}long long ans=0;
sort(p,p+len+1 ,cmp);
for (int i=0;i<=len;++i) if ((p[i]^ans)>ans) ans=p[i]^ans;
//for (int i=1;i<=len;++i) printf("%lld ",p[i]);
printf("%lld",ans);
return 0;
}
相關推薦
luogu3812 線性基模板
http://www.elijahqi.win/archives/1683題目背景 這是一道模板題。 題目描述 給定n個整數(數字可能重複),求在這些數中選取任意個,使得他們的異或和最大。 輸入輸出格式 輸入格式: 第一行一個數n,表示元素個數 接
[線性基 模板]
網上找到一篇寫的非常棒的文章Orz, 看完之後相信你一定也可以學會並理解 點我 個人理解線性基的關鍵: 線性基可以有多個,但是每個內部一定都是線性無關的,也就是說對於一個可以用線性基表示的x來說, 其組成方案一定是唯一的, 所以一個線性基的任意子集都不會構造出0.
線性基模板
struct L_B{ long long d[61],p[61]; int cnt; L_B() { memset(d,0,sizeof(d)); memset(p,0,sizeof(p));
線性基模板題hdu3949
hdu3949 XOR 題目大意: 就是給你長度為N的學列,有Q次查詢,每次查詢這寫序列中能異或出來的第k小的值 解題思路 : 本題是一個線性基的入門題。 其實線性基的求解過程就是一個高斯消元,它構建了一個二維的空間,N*bits這麼大, 通過列與列相消,求解
高斯消元&線性基模板
高斯消元:poj1222#include <iostream> #include <cstdio> #define N 5 #define M 6 #define L 10 us
線性基 模板 bzoj2460 【BeiJing2011】 元素
題目大意: 有許多礦石,礦石有編號和價值兩種屬性,我們要求一個集合,使得該集合任意子集編號異或和不為0,並且要求價值和儘量大。 題目分析: 先科普線性基。 線性基是我們構造出一個集合,這個集合中
[洛谷3812]【模板】線性基
ons int() 方法 algorithm 每一個 枚舉 nbsp max tchar 題目大意: 給你n個數,求這些數能異或出的數的最大值。 思路: 線性基模板。 b中的數滿足對於每個b[i],最高位在第i位。 構造方法就是對於每個數字,從
洛谷P3812 【模板】線性基
int clas ott style psu ont radi reg query 題目背景 這是一道模板題。 題目描述 給定n個整數(數字可能重復),求在這些數中選取任意個,使得他們的異或和最大。 輸入輸出格式 輸入格式: 第一行一個數n,表示元素個數
題解——洛谷P3812【模板】線性基
打了 () 運算優先級 運算 pac sca bre std 線性基 學了下線性基 使用好像並不復雜 打了板子 但是要註意位運算優先級 #include <cstdio> #include <algorithm> #include &
【模板】線性基
ans clu using mem sizeof efi 輸入輸出 std ont 線性基就是一種可以維護異或和的東西,我還沒太懂它到底有什麽用,但是很好寫,而且思路也很清晰,所以板子還是很簡單的。 題幹: 題目背景 這是一道模板題。 題目描述 給定n個整
【模板】線性基(洛谷P3812)
size for 最大 個數 cstring 異或 namespace 元素 線性 Description 給定\(n\)個整數(數字可能重復),求在這些數中選取任意個,使得他們的異或和最大。 Input 第一行一個數\(n\),表示元素個數 接下來一行\(n\
[模板]線性基
int getchar() 它的 turn 繼續 def lin 相同 掃描 用途 處理關於子集的異或和的問題,比如子集異或和的最大值,或者能不能異或出某個數 原理 從一堆數中處理出一組線性無關(?)的數,使得這些數能異或出的數和原來能異或出的數相同 線性基中,以每
線性基【模板】
文章目錄題目連結: 題目連結: #include"bits/stdc++.h" using namespace std; typedef long long LL; const int maxn=1e
線性基總結(模板)+ BZOJ 2460
所謂線性基,就是線性代數裡面的概念。一組線性無關的向量便可以作為一組基底,張起一個線性的向量空間,這個基地又稱之為線性基。這個線性基的基底進行線性運算,可以表示向量空間內的所有向量,也即所有向量可以拆成基底的線性組合。 在ACM領域,線性基主要用來處理
線性基處理異或運算——模板+例題
線性基:處理異或操作的強大工具,思想也是可以借鑑的。 作用:用於處理多個數中選取一些數的XOR的最大值,最小值,第k大值,並可以查詢能否通過集合中任意個數XOR得到,時間複雜度為O(n*logn) 具體模板如下,思路和程式碼均參考於大佬的部落格,感謝解惑~
P3812 【模板】線性基
不得不說,線性基是一個神奇的東西 它維護的東西與“異或”密切相關 題意: 給定n個整數(數字可能重複),求在這些數中選取任意個,使得他們的異或和最大。 當然,也可以最小,甚至,可以求任意異或和第k大!(哇,好niubi) 做法:開一個數組a[MAXN],MAXN是數字最高位數。 a[i
模板 - 數學 - 線性基
等價 快速 處理 fine 當前 () target hellip 遍歷 終於開始啃這個破東西了。 抄襲自:https://www.luogu.org/blog/Marser/solution-p3812 線性基某個問題描述: 給定n個整數(數字可能重復),求在這些數
模板—數學—線性基
!= scanf space true highlight -- long tex define 模板—數學—線性基 Code(高斯消元版): #include <cstdio> #include <algorithm&g
HDU 3949 XOR(線性基)
void scan one lld cstring ons ems stack utc 題意:給出一組數,求最小的第k個由這些數異或出來的數。 先求這組數的線性基。那麽最小的第k個數顯然是k的二進制數對應的線性基異或出來的數。 # include <cstdi
[BeiJing2011]元素[貪心+線性基]
插入 logs input gree 隨著 包含 etc online ref 2460: [BeiJing2011]元素 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1245 Solved: 652[Submit