最大異或
time limit:10000ms memory limit:65536k
total submit:59 accepted:32
case time limit:1000ms
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」
觀察以下數
00000
00001
00010
00011
00100
00101
00110
00111
01000
01001
01010
01011
01100
01101
01110
01111
10000
10001
10010
求[0,18]區間的最大異或:
顯然是16^15=(10000)2^(01111)2=(11111)2=31
求[0,15]區間的最大異或:
顯然是8^7=(01000)2^(00111)2=(01111)2=15
求[0,7]區間的最大異或:
顯然是4^3=(00100)2^(00011)2=(00111)2=7
規律:我們要求區間[l,r]的最大異或,只需在區間[l+1,r]中找出值最大的乙個二進位制形式形如「0...0100...0」的數,即2的次方
設此數為x,那麼答案就是x^(x-1)
若範圍內無這種2的次方數,例如:
01001
01010
01011
01100
01101
01110
01111
我們發現整個區間的所有數字都最高位的1都相同,我們把它們全部抹掉。變成下面的樣子:
00001
00010
00011
00100
00101
00110
00111
我們可以應用上面的規律:
其中最大的異或值為000100^000011
#include#include#define er long long
using namespace std;
er s(er x)
er solve(er l,er r){
er a=s(l),b=s(r);
if(a!=b) return (1ll<>a>>b;
cout<
最大異或和
問題描述 給出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...