51nod1312 最大異或和

2022-05-13 12:01:56 字數 1631 閱讀 8980

基準時間限制:1 秒 空間限制:131072 kb 分值: 320 

有乙個正整數陣列s,s中有n個元素,這些元素分別是s[0],s[1],s[2]...,s[n-1]。現在你可以通過乙個操作來更新陣列。操作方法如下:

選擇兩個不同的數i、j(0<=i,j

你可以進行任意多次操作,問最後生成的陣列s的元素和 sum = s[0]+s[1]+s[2]+...+s[n-1] 最大可能值是多少。輸出這個最大值。

例如:s = ,去a = s[1] xor s[0] = 1,b = s[0] = 1,新的s=,sum = 1+1 = 2.

input

第一行乙個整數n,且1<=n<=50

接下來n行每行乙個整數s[i],且0<=s[i]<=1,000,000,000,000,000 (10^15)

output

乙個整數,即最後集合可能的最大值sum。
input示例

312

3

output示例

8

數學問題 線性基 貪心

顯然就是線性基。

假設我們需要k個數來搞出線性基,那麼有n-k個數可以取到異或空間裡的最大值max。

這k個數線性無關,為了使他們最大,我們先把它們消到盡可能小,再異或max。

↑把得到的n個數累加起來就是答案。

秒題三分鐘,寫題一小時?exm?

動態維護線性基看上去並沒有問題,然而交上去無限wawawa。

然後突然意識到年初的時候和sfailsth討論過的問題:高斯消元得到的線性基向量一定是該位為1的所有可能得到的向量中最小的,而動態維護線性基得到不一定是最小的。

於是手動把線性基向量消到最小,ac

1 #include2 #include3 #include4 #include5 #include6

#define ll long long

7using

namespace

std;

8const

int mxn=65;9

ll read()

12while(ch>='

0' && ch<='9')

13return x*f;14}

15int

n;16

ll a[mxn],b[mxn],f[mxn];

17int

main()

25 b[i]^=f[j];26}

27}28 ll mx=0;int cnt=0;29

for(i=62;i>=0;i--)

30if

(f[i])

32 cnt++;33}

34 ll ans=0

;35 ans+=mx*(n-cnt+1

);36 cnt--;

37for(i=0;cnt && i<=62;i++)43}

44 ans+=mx^f[i];

45 cnt--;46}

47}48 printf("

%lld\n

",ans);

49return0;

50 }

51nod 1312 最大異或和

很顯然我們求出一組線性基來,如果有m個基,那麼可以構造n m 1個最大異或值 而對於線性基中的元素,除了最大的元素,我們用最大異或值異或掉每個元素累加進答案 而不是把線性基中的元素處理成乙個下三角矩陣 include include include include include include d...

51nod1312 最大異或和(線性基)

傳送門 先把線性基建出來 顯然其他所有數都可以湊成線性基的最大值 考慮怎麼讓線性基內和最大 手玩一下可以發現最優情況是最高位的都有,剩下每乙個基都少填乙個 include using namespace std const int rlen 1 20 1 inline chargc define i...

最大異或和

問題描述 給出n個整數,多組詢問求乙個給出的數與這n個數中的乙個數的最大異或的值。輸入格式 第一行乙個整數n,表示有個數字。第二行n個正整數。第三行乙個整數m,表示m個詢問。第四行m個整數,表示m個詢問的整數。輸出格式 共m行,對於每個詢問輸出最大的異或值。輸入樣例 43 5 6 7 31 4 7 ...