nyoj 947 Max Xor(字典树)
生活随笔
收集整理的這篇文章主要介紹了
nyoj 947 Max Xor(字典树)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Max Xor
時間限制:3000?ms ?|? 內存限制:65535?KB 難度:4 描述第 1 行 1 個數 n。(1<=n<=10^5)
接下來的 1 行有 n 個數 ai。(0<=ai<=10^12)
解題思路:這道題很巧妙,首先把數字變成01串,這個很容易想到,但關鍵是如何處理這些01串,使得其xor最大。這里采用了字典樹,將所有01串都放在字典樹上,然后通過字典樹的匹配去尋找最大的xor值。
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> using namespace std;typedef long long LL; const int maxn = 100005; struct Node {Node *next[2]; }; int n,c[55]; LL a[maxn]; Node *root;void process(LL s) {int num = 50;memset(c,0,sizeof(c));while(s){c[num--] = s % 2;s /= 2;} }void insert(LL s) {process(s);Node *p = root;for(int i = 0; i <= 50; i++){if(p->next[c[i]] == NULL){p->next[c[i]] = (Node *)malloc(sizeof(Node));p->next[c[i]]->next[0] = NULL;p->next[c[i]]->next[1] = NULL;}p = p->next[c[i]];} }LL find(LL s) {process(s);Node *p = root;LL sum = 0;for(int i = 0; i <= 50; i++){if(p->next[!c[i]] == NULL){sum = sum * 2;p = p->next[c[i]];}else {sum = sum * 2 + 1;p = p->next[!c[i]];}}return sum; }int main() {while(scanf("%d",&n)!=EOF){for(int i = 1; i <= n; i++)scanf("%lld",&a[i]);root = (Node *)malloc(sizeof(Node));root->next[0] = root->next[1] = NULL;for(int i = 1; i <= n; i++)insert(a[i]);LL ans = 0;for(int i = 1; i <= n; i++)ans = max(ans,find(a[i]));printf("%lld\n",ans);}return 0; }總結
以上是生活随笔為你收集整理的nyoj 947 Max Xor(字典树)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【技术文档】jeecg3.7-maven
- 下一篇: hihocoder 第113周 Fibo