2014 百度之星 1003 題解 Xor Sum

2021-06-22 04:28:59 字數 1606 閱讀 1922

problem description

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 63

sample output

case #1:43

case #2:4

看起來很簡單的題目,因為使用暴力法的**很簡單,但是這道題使用暴力法超時,所以就成為難題了。

題目應該使用trie資料結構去解,而且是trie的基本構建和搜尋了。

和一般的trie不同,就是不用26個分支了,這裡只有兩個分支,那麼就更加簡單了。

我一直都不太喜歡杭電的oj,就是因為他們的輸入輸出感覺不夠智慧型,尾部多個換行符或者少個換行符都不成,一般oj都不管這個判斷答案的了。

而且本題使用自家寫的io也不行,浪費我不少時間。

我這道題是從高位到低位構建trie的,也是從高位到低位搜尋。而且樹高是固定33. 搜尋效率接近常數.

下面是收拾過的**,帶上釋放記憶體,形成良好的程式設計習慣。

#include #include #include using std::bitset;

class xorsum1003_4

~node()

};struct tree

~tree()

};tree *trie;

void insertnode(long long n)

pcrawl = pcrawl->children[bs[i]];

} }long long serachxor(long long n)

else

}else

else

}} return ans.to_ullong();

}public:

xorsum1003_4() : trie(null)

for (int k = 0; k < m; k++)

}} ~xorsum1003_4()

};

2014百度之星1001

problem description 魔法師百小度也有遇到難題的時候 現在,百小度正在乙個古老的石門面前,石門上有一段古老的魔法文字,讀懂這種魔法文字需要耗費大量的能量和大量的腦力。過了許久,百小度終於讀懂魔法文字的含義 石門裡面有乙個石盤,魔法師需要通過魔法將這個石盤旋轉x度,以使上面的刻紋與天...

2018百度之星初賽1003

problem description 度度熊有一張紙條和一把剪刀。紙條上依次寫著 n 個數字,數字只可能是 0 或者 1。度度熊想在紙條上剪 k 刀 每一刀只能剪在數字和數字之間 這樣就形成了 k 1 段。他再把這 k 1 段按一定的順序重新拼起來。不同的剪和接的方案,可能會得到不同的結果。度度熊...

百度之星複賽題解

problem description 眾所周知,度度熊非常喜歡數字。它最近在學習小學算術,第一次發現這個世界上居然存在兩位數,三位數 甚至n位數!但是這回的算術題可並不簡單,由於含有表示bomb的 號,度度熊稱之為 arithmetic of bomb。bomb number中的bomb,也就是 ...