線性基可以解決的問題:給定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,沒有比之前更大,我們以此類推是不是就可以把完整的給求出來了。
#include #include #include #include #include #include #include #include #include #include #include #include #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)
x ^= p[i];
}}inline void init()
int main()
ll ans = 0;
for(int i=50; i>=0; i--)
printf("%lld\n", ans);
return 0;
}
P3812 模板 線性基
線性基是什麼?你可以理解為將乙個序列處理完之後得到的產物,並且有如下性質 1.原序列裡面的任意乙個數都可以由線性基裡面的一些數異或得到。2.線性基裡面的任意一些數異或起來都不能得到0 3.線性基裡面的數的個數唯一,並且在保持性質一的前提下,數的個數是最少的 因此,線性基可以計算一段序列中異或和最大,...
P3812 模板 線性基
n 給定乙個長度為n nn的序列,要從中選出若干個數,使得它們的異或值最大,輸出這個最大值 資料範圍 n 50 n leq 50 n 50 sol utio nsolution soluti on線性基的異或值域和原序列的異或值域相同,考慮構造線性基,每次比較是否需要異或,這樣一定不會更劣 時間複雜...
P3812 模板 線性基
p3812 模板 線性基 給定n個整數 數字可能重複 求在這些數中選取任意個,使得他們的異或和最大 把所有數insert進入線性基,把線性基中所有元素xor起來 ans include typedef long long ll using namespace std inline int read ...