P3812 模板 線性基

2021-09-25 12:05:49 字數 1648 閱讀 3468

線性基可以解決的問題:給定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 ...