codeforce 位運算 最大異或

2021-07-11 13:31:43 字數 1428 閱讀 4392

nkoj 2060

description

乙個小女孩非常喜歡關於二進位制位的問題,下面是其中乙個問題: 

給你兩個整數l和r,找出a xor b結果值最大的一對,(l ≤ a ≤ b ≤ r) 

xor表示異或,在c++裡的運算子是"^" 

input

兩個空格間隔的整數l和r (1<=l<=r<=1018)

output

乙個整數,表示最大的異或的結果

sample input

樣例輸入1:

1 2樣例輸入2:

8 16

樣例輸入3:

1 1

sample output

樣例輸出1:

3樣例輸出2:

31樣例輸出3:

0

hint

注意:一般情況下我們只在32位數字範圍內進行位運算 

如果要在64位也就是long long範圍內做位運算,參與運算的必須是long long型別,比如把1左移60位,我們應寫成「1ll<<60」 

分析:

1 => 00001

2 => 00010

3 => 00011

4 => 00100

5 => 00101

6 => 00110

7 => 00111

8 => 01000

9 => 01001

10 => 01010

11 => 01011

12 => 01100

13 => 01101

14 => 01110

15 => 01111

16 => 10000

17 => 10001

18 => 10010

solve(l,r)表示區間[l,r]的最大異或。

由0~18可以歸納出,當l,r的二進位制位數不同的時候,所求的就是 2^p-1 (其中p是r的二進位制位數)

當l,r的二進位制位數相同,根據異或運算的法則,最高位的計算結果一定是0,可以直接抹去。

**如下:

#include#include#define ll long long

using namespace std;

ll bitcnt(ll x)

ll solve(ll l,ll r)

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

if(temp<=a)

} }

最大異或和

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

最大異或對

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

最大異或對

最大異或對 題解 這題採用的是01字典樹,一般這種異或問題都採用的是01字典樹樹解決。includeusing namespace std const int n 2e6 1 typedef long long ll ll a n int cnt 1 int tree 3 n 2 void inse...