Chip Factory HDU - 5536 字典树(删除节点|增加节点)

题意:

t组样例,对于每一组样例第一行输入一个n,下面在输入n个数

你需要从这n个数里面找出来三个数(设为x,y,z),找出来(x+y)^z(同样也可以(y+z)^1)的最大值 (“^”代表异或操作,即“相同为0,不同为1”)

题解:

这一道题和Xor Sum HDU - 4825很相似

因为异或运算的特性,我们最后要求最大值,那我们就对这n个数的二进制形式建一颗字典树。然后就暴力枚举是哪两个数相加,然后在字典树中把这两个数删掉。然后在处理完的字典树中查找那个能使结果尽可能大的第三个数(至于怎么查找具体看代码)

代码:

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <cstdlib>
  5 #include <algorithm>
  6 using namespace std;
  7 typedef long long ll;
  8 const int maxn=2;
  9 typedef struct Trie* TrieNode;
 10 ll v[1005];
 11 struct Trie
 12 {
 13     ll val,sum;
 14     TrieNode next[2];
 15     Trie()
 16     {
 17         val=0;
 18         sum=0;
 19         memset(next,NULL,sizeof(next));
 20     }
 21 };
 22 
 23 void inserts(TrieNode root,ll x,ll y)
 24 {
 25     TrieNode p = root;
 26     for(ll i=31;i>=0;--i)
 27     {
 28         ll temp=(x>>i)&1;
 29         if(p->next[temp]==NULL) p->next[temp]=new struct Trie();//printf("*%d*",temp);
 30         p->next[temp]->sum+=y;
 31         p=p->next[temp];
 32         //printf("%d ",p->sum);
 33         //p->sum+=y;
 34         //printf("%lld %lld %lld\n",i,p->sum,temp);
 35     }
 36     p->val=x;
 37 }
 38 
 39 ll query(TrieNode root,ll x)
 40 {
 41     TrieNode p = root;
 42     for(ll i=31;i>=0;--i)
 43     {
 44         ll temp=((x>>i)&1)^1;
 45         if(p->next[temp]!=NULL && p->next[temp]->sum>0)
 46         {
 47             p=p->next[temp];
 48         }
 49         else
 50         {
 51             temp=(x>>i)&1;
 52             if(p->next[temp]!=NULL && p->next[temp]->sum>0)
 53                 p=p->next[temp];
 54             else //if(p->next[temp]==NULL && p->next[temp^1]==NULL)
 55             {
 56                 //printf("****");
 57                 //printf("%d\n",p->val);
 58                 return x^p->val;
 59             }
 60             //else
 61         }
 62     }
 63     return x^p->val;
 64 }
 65 void Del(TrieNode root)
 66 {
 67     for(ll i=0 ; i<2 ; ++i)
 68     {
 69         if(root->next[i])Del(root->next[i]);
 70     }
 71     delete(root);
 72 }
 73 
 74 int main()
 75 {
 76     ll t,n;
 77     scanf("%lld",&t);
 78     while(t--)
 79     {
 80         TrieNode root = new struct Trie();
 81         scanf("%lld",&n);
 82         for(ll i=1;i<=n;++i)
 83         {
 84             scanf("%lld",&v[i]);
 85             inserts(root,v[i],1);
 86         }
 87         ll ans=0;
 88         for(ll i=1;i<=n;++i)
 89         {
 90             inserts(root,v[i],-1);
 91             for(ll j=i+1;j<=n;++j)
 92             {
 93                 inserts(root,v[j],-1);
 94                 ans=max(ans,query(root,v[i]+v[j]));
 95                 inserts(root,v[j],1);
 96             }
 97             inserts(root,v[i],1);
 98         }
 99         printf("%lld\n",ans);
100         Del(root);
101     }
102     return 0;
103 }

猜你喜欢

转载自www.cnblogs.com/kongbursi-2292702937/p/12001393.html
今日推荐