acwing143 144最大異或和

2021-10-02 14:44:18 字數 1790 閱讀 9200

acwing143

在給定的n個整數a1,a2……an中選出兩個進行xor(異或)運算,得到的結果最大是多少?

建乘一字典樹。插入0,1(從高位向低位)

查詢相當於貪心?因為從高位查起,所以滿足這一位即使後面每一位不滿足,也比這一位不滿足後面每一位都滿足要強(二進位制真好)

**

#include

#include

using

namespace std;

int n;

bool a[

100005][

32];int t[

3200005][

2];int tot=1;

void

inst

(int x)

}int

search

(int x)

int ret=0;

for(

int i=

31;i>=1;

--i)

return ret;

}int

main()

inst

(i);

}int ans=0;

for(

int i=

1;i<=n;

++i)

printf

("%d\n"

,ans)

;return0;

}

acwing144

給定乙個樹,樹上的邊都具有權值。

樹中一條路徑的異或長度被定義為路徑上所有邊的權值的異或和.

給定上述的具有n個節點的樹,你能找到異或長度最大的路徑嗎?

和剛剛的題一樣。多一步預處理:

可以將所有的i->j路徑異或和看為i->root xor root->j

即使有重疊也沒關係 因為異或滿足:

a xor a=0

a xor 0 =a

(a xor b) xor c=a xor (b xor c)

然後重複143的操作。

**

#include

#include

using

namespace std;

int n,ans;

struct edge

e[200005];

int h[

100005

],tot;

void

add_edge

(int u,

int v,

int w)

int a[

100005][

32];void

dfs(

int x,

int fa)}}

int t[

3200005][

2],cnt=1;

void

inst

(int x)

}void

search

(int x)

int ret=0;

for(

int i=

31;i>=1;

--i)

ans=

max(ans,ret);}

intmain()

dfs(0,

0);for

(int i=

0;i++i)

inst

(i);

search

(i);

}printf

("%d\n"

,ans)

;return0;

}

AcWing 143 最大異或對

題目描述 在給定的n個整數a1,a2 an中選出兩個進行xor 異或 運算,得到的結果最大是多少?輸入格式 第一行輸入乙個整數n。第二行輸入n個整數a1 an。輸出格式 輸出乙個整數表示答案。資料範圍 1 n 10 5,0 ai 2 31 輸入樣例 3 1 2 3輸出樣例 3分析 本題要求我們從n個...

Acwing143 最大異或對

用乙個tire樹來存下n個數的二進位制形式的01串,串的長度是31,因為每個數最多為2 31所以,取31,然後根據異或的特性,列舉一下所有的數,取這個數的反碼,去樹中尋找盡可能和反碼向同的路徑,並且記錄下路徑過程的異或值即可 include include include using namespa...

acwing 143 最大異或對

題面 在給定的n個整數a1,a2 an a1,a2 an a1,a2 an中選出兩個進行xor 異或 運算,得到的結果最大是多少?輸入格式 第一行輸入乙個整數n。第二行輸入n個整數a 1 a1 a1 a n an an。輸出格式 輸出乙個整數表示答案。資料範圍1 n 105 1 n 105 1 n ...