zeus 和 prometheus 做了乙個遊戲,prometheus 給 zeus 乙個集合,集合中包含了n個正整數,隨後 prometheus 將向 zeus 發起m次詢問,每次詢問中包含乙個正整數 s ,之後 zeus 需要在集合當中找出乙個正整數 k ,使得 k 與 s 的異或結果最大。prometheus 為了讓 zeus 看到人類的偉大,隨即同意 zeus 可以向人類求助。你能證明人類的智慧型麼?
input
輸入包含若干組測試資料,每組測試資料報含若干行。
輸入的第一行是乙個整數t(t < 10),表示共有t組資料。
每組資料的第一行輸入兩個正整數n,m(<1=n,m<=100000),接下來一行,包含n個正整數,代表 zeus 的獲得的集合,之後m行,每行乙個正整數s,代表 prometheus 詢問的正整數。所有正整數均不超過2^32。
output
對於每組資料,首先需要輸出單獨一行」case #?:」,其中問號處應填入當前的資料組數,組數從1開始計算。
對於每個詢問,輸出乙個正整數k,使得k與s異或值最大。
sample input
2
3 23 4 515
4 14 6 5 6
3
sample output
case #1:43
case #2:
4
你能證明人類的智慧型麼?——不能(逃
首先,我們要考慮的是怎麼樣的數異或起來會很大呢?就是換成二進位制以後,每一位上都不一樣唄,那我們就可以拿詢問的這個數換成二進位制以後和給你的數從高位往地位比——馬上有大佬跳起來了:你這樣做還不如直接用o(1)是時間去異或一下求個max來的快
別急,有沒有發現我們要比較的是詢問的這個數和集合中所有數的字首,說道字首,你應該要想到乙個東東叫做——trie字典樹(那是什麼鬼!戳),相信有人已經恍然大悟了,於是乎我們得到了以下思路:
1.把所有集合中的數以01串的形式從高位往地位放進trie裡面(注意高位不足補齊32位)
2.對於詢問的數換成二進位制以後從高位開始與線段樹上的點匹配,如果這一位是0就往1走,如果這一位是1就往0走,如果要走的點不存在,那我們只好順著存在的點走(每個點(除葉子節點)都至少有乙個兒子,因為所有串的長度都是32)
3.輸出走到葉子後找到的那個數
ok,完事
c++**
#include
using
namespace std;
int sum=
1,l;
int tr[
2000000][
2];long
long flag[
2000000
],maxx=0;
void
build
(long
long s)
k=tr[k]
[p];
} flag[k]
=s;}
long
long
find
(long
long s)
return flag[k];}
intmain()
while
(m--)}
return0;
}
與xj機房607 題解 bzoj4825 HNOI2017單旋
h 國是乙個熱愛寫 的國家,那裡的人們很小去學校學習寫各種各樣的資料結構。伸展樹 splay 是一種資料結構,因為 好寫,功能多,效率高,掌握這種資料結構成為了 h 國的必修技能。有一天,的 卡 帶著他的 的 常數 來企圖毀滅 h 國。卡 給 h 國的人 說,splay 如果寫成單旋的,將會更快。卡...
hdu1285 hdu4857 拓撲排序
一 原題內容 problem description 有n個比賽隊 1 n 500 編號依次為1,2,3,n進行比賽,比賽結束後,裁判委員會要將所有參賽隊伍從前往後依次排名,但現在裁判委員會不能直接獲得每個隊的比賽成績,只知道每場比賽的結果,即p1贏p2,用p1,p2表示,排名時p1在p2之前。現在...
樹狀陣列 hdu2689 hdu2838
題意 給定乙個正整數n,和乙個1 n的乙個排列,每個數可以和旁邊的兩個數的任意乙個交換,每交換一次總次數就要加一,問將這個排列轉換成乙個遞增的排列需要多少次交換?題意可以轉換成求這個排列的逆序對數。include include include include using namespace std...