難度較大,請勿棄療
給定n個整數(數字可能重複),求在這些數中選取任意個,使得他們的異或和最大。
n<=50
sample input33
21sample output
3
看上去莫名其妙地想貪心。。。
給些定義:
s 為無符號整數集 即s
∈n∗記為
xor−
sum(
s) x
or−s
um(s
)=s1
⊕s2⊕
....
⊕s|s
| 記為s
pan(
s)對於所有t∈
s ,有xo
r−su
m(t)
∈spa
n(s)
就是所有子集異或和的集合
前方高能!!!
s 若有元素sj
,使s去掉sj
後的集合s′
滿足 sj
∈spa
n(s′
) 則稱s
線性相關,否則稱
s線性無關
前方高能!!!*2+重點!!!若b
為s的線性基
b 滿足
1. b∈s
,s∈s
pan(
b)2. b
線性無關
線性基的長度為|b
| 前方高能!!!*3+重點!!!*2
我們設sma
x 為
s 中最大的元素 設l
en=l
og2(
smax
)我們可用乙個陣列g[
len]
的陣列儲存線性基
對於每個i,
gi只有兩種可能:
1. gi=
0 所有j
使igj
第i位∈
2. gi≠
0 所有j
使j≠i
gj第i
位=0所有
j 使
ii 第
j 位=0
所有j使i
>jg
i 第
j 位∈
假設插入數字x
流程參考**
void insert(ll x)
}
看了**,你也許會大呼簡單
前面當然要加上插入啊
ll ans=0;
fr(i,0,len-1)
ans^=g[i];
模板 線性基模板
數學太差,直接線性基當資料結構用orz 表示數集 1,2 k 1 表示乙個異或集合 可以說是將原數集壓縮 性質 直接抄的orz,雖然也不是特別懂 0 2.線性基的異或集合中每個元素的異或方案唯一,其實這個跟性質1是等價的。3.線性基二進位制最高位互不相同。1,2n 1 1,2n 1 1,2n 1 5...
模板 線性基
給定n個整數 數字可能重複 求在這些數中選取任意個,使得他們的異或和最大。線性基模板可解決 將n個整數看做集合a 線性基即為集合a的子集 線性基中每個元素的異或方案唯一,也就是說,線性基中不同的異或組合異或出的數都是不一樣的。線性基的二進位制最高位互不相同。這樣我們先構造出線性基 然後貪心的去搞最大...
線性基 模板
線性基的用處 洛谷p3812 牛客練習賽26d 參考部落格 這位童鞋寫得很好 求異或最大值 include bits stdc h using namespace std typedef long long ll const int maxn 1e5 5 const int mod 1e9 7 co...