题意:
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 }