最大異或(字典樹應用)

2021-08-21 21:07:36 字數 2336 閱讀 3407

乙個字典樹與異或運算的集合。當時寫超時了,不知道為什麼。。。先記錄下來

題目: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異或值最大。

2

3 23 4 515

4 14 6 5 6

3

case #1:43

case #2:

4

[提交][狀態]

#include#include#include#includeusing namespace std;

#define ll long long

const int maxn = 1e5+5;

const int inf = 0x3f3f3f3f;

int pre[maxn][40];

int arr[maxn];

int len;

int tree[maxn*100][2];

int ans[50];

void init()

void fun(int x)

int k = len;

while(!que.empty())}

int rt = 1;

void build(int x)

}int pp[50];

int an;

void query()}

int main()

len = floor(log(ma)/log(2))+1;

memset(pre, 0, sizeof(pre));

memset(tree, 0, sizeof(tree));

rt = 1;

for(int i = 1; i <= n; i++)

printf("case #%d:\n", kase++);

while(m--)

if (lenth >= len)

}else

}for(int i = 1; i <= len; i++) pp[i] ^= 1;

query();

printf("%d\n", an);}}

return 0;}

超時**

#include using namespace std;

#define max 2

typedef struct trietrie;

trie *root = new trie();

void creattrie(int *str,int m) //建立字典樹的過程,

else

for (int j=0;jnext[j]=null;

}c_root->next[id]=p;

c_root=c_root->next[id];

} else

} }

void binarycout(int m,int n) //求32位的二進位制,並儲存在乙個陣列裡

}

int findtrielocation(int *str) //

else

}

else

else

} } return f_root->v;}

int main()

cin>>t;

int flag=1;

while(t--)

for (int j=0;j>a[j];

} for (int j=0;j這裡有乙個比較知識點,將乙個十進位制數轉化為二進位制數存進陣列裡

void binarycout(int m,int n) //求32位的二進位制,並儲存在乙個陣列裡

}

有時間在研究一下!

最大異或對 字典樹

在給定的n個整數a1,a2 an中選出兩個進行xor 異或 運算,得到的結果最大是多少?輸入格式 第一行輸入乙個整數n。第二行輸入n個整數a1 an。輸出格式 輸出乙個整數表示答案。資料範圍 1 n 105,0 ai 231 輸入樣例 31 2 3 輸出樣例 3 基於貪心的思想 異或是一種不進製加法...

字典樹 最大異或對

分析程式 最大異或對,就是給出一堆數,然後在這一堆數中選擇兩個數,使得異或後結果最大。所涉及到的知識點有 字典樹,二進位制的思想 這樣寫不出意外是會超時的,因為這樣看的話,他的時間複雜度是o n n 然後題中給出的資料是10的五次方。所以說這樣的話,需要執行10的十次方次操作,而機器在一秒中只能執行...

最大異或對 字典樹)

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