線性基:線性基是一種特殊的基,它通常會在異或運算**現,它的意義是:通過原集合s的某乙個最小子集s1使得s1內元素相互異或得到的值域與原集合s相互異或得到的值域相同。線性基有三個性質:
1、原序列裡面的任意乙個數都可以由線性基裡面的一些數異或得到。
2、線性基裡面的任意一些數異或起來都不能得到0
3、線性基裡面的數的個數唯一,並且在保持性質一的前提下,數的個數是最少的
簡單說明一下性質一和二:
首先我們要知道乙個關於異或的小性質:
若a ⊕b
⊕c=0
a\oplus b \oplus c = 0
a⊕b⊕c=
0 則a⊕b
=c
a \oplus b = c
a⊕b=
c,若a⊕b
=c
a \oplus b=c
a⊕b=c則a⊕c
=b
a\oplus c=b
a⊕c=b。
性質一當不能成功插入線性基時:
肯定是它在嘗試插入時異或若干數後變成0
有x ⊕d
[a]⊕
d[b]
⊕d[c
]⊕..
.=
0x\oplus d[a] \oplus d[b] \oplus d[c] \oplus ... = 0
x⊕d[a]
⊕d[b
]⊕d[
c]⊕.
..=0
根據上面小性質則有d[a
]⊕d[
b]⊕d
[c]⊕
...=
xd[a]\oplus d[b] \oplus d[c] \oplus...=x
d[a]⊕d
[b]⊕
d[c]
⊕...
=x所以,若不能插入線性基,則線性基里必定有一些數異或和等於x。
當成功插入線性基時:
我們假設x插入到了線性基的第i個位置,顯然,它在插入前可能異或若干個數,那麼就有:
x ⊕d
[a]⊕
d[b]
⊕d[c
]⊕..
.=d[
i]
x \oplus d[a] \oplus d[b]\oplus d[c] \oplus...=d[i]
x⊕d[a]
⊕d[b
]⊕d[
c]⊕.
..=d
[i]轉換一下:
d [a
]⊕d[
b]⊕d
[c]⊕
...d
[i]=
xd[a] \oplus d[b] \oplus d[c] \oplus ...d[i]=x
d[a]⊕d
[b]⊕
d[c]
⊕...
d[i]
=x所以顯然x
xx也可以由線性基里若干個數異或得到。
性質二設d[a
]⊕d[
b]⊕d
[c]=
0d[a] \oplus d[b] \oplus d[c] = 0
d[a]⊕d
[b]⊕
d[c]
=0則d [c
]=d[
a]⊕d
[b
]d[c]=d[a] \oplus d[b]
d[c]=d
[a]⊕
d[b]
因為d [c
]d[c]
d[c]
可以由d[a
]d[a]
d[a]
和d [b
]d[b]
d[b]
得到,所以所以線性基中不存在有任何數異或起來可以得到0。
線性基的插入
bool insert(int x)
x ^= a[i];}}
return x > 0;
}
取最大值int query()
return ret;
}
k小值void rebuild()
long long kthquery(long long k)
關於線性基的學習與理解
若干數的線性基是一組數a1 a2,a n 其中ax 的最高位的1在第x位。通過線性基中元素xor出的數的值域與原來的數xor出數的值域相同。對每乙個數p從高位到低位掃,掃到第x位為1時,若ax 不存在,則ax p並結束此數的掃瞄,否則令p pxor ax。用線性基求這組數xor出的最大值 從高往低掃...
線性基總結(其實就是我的模板)
學過線代裡面的 基向量 基向量說的就是一組可以表示整個空間的向量。比如在三維空間中乙個基向量就是 1,0,0 0,1,0 0,0,1 線性基的定義也類似,給你乙個陣列a 它的線性基就是一組可以表示陣列a中任意乙個數的乙個陣列p 這個表示的意思就和前面的基向量表示的意思類似,是通過p中幾個元素的異或得...
加密 我的簡單理解
login前,先通過rsa獲取公鑰 login時,對password密碼進行公鑰加密,加密後,直接提交伺服器,利用伺服器進行解密,解密用到私鑰 解密後返回資料,這裡有乙個資料tokens,在專案中,一般這個資料都是永久性有效的,當然有時候返回的資料是整體加密的,token被伺服器aes加密了,約定的...