您的位置:首页 > 其它

【HDU】 5536 Chip Factory

2016-03-14 17:30 274 查看

Chip Factory

题目链接

Chip Factory

题目大意

说有一组数,你需要从其中选取3个数a b c,使得(a+b) xor c 达到最大。

题解

建立一棵字典树,每个数用2进制表示插入树中,我们先枚举a跟b,将a跟b从字典树中删除,最后在字典树中查找a+b的“反码”(因为要使最后的异或结果最大)。如果有节点就继续查找,没有节点就走另一边。

代码

#include <iostream>
#include <cstring>
#include <cstdio>

using namespace std;

struct Trie
{
Trie *ch[2];
int val;
};
Trie *root;
int a[1005],T,n,ans;

void _insert(int s)
{
Trie *p=root,*q;
for (int i=30;i>=0;i--)
{
int ch;
if (s&(1<<i)) ch=1;
else ch=0;
if (p->ch[ch]) p->ch[ch]->val++;
else
{
q=new Trie;
for (int i=0;i<2;i++) q->ch[i]=NULL;
q->val=1;
p->ch[ch]=q;
}
p=p->ch[ch];
}
}

void _delete(int s)
{
Trie *p=root;
int ch;
for (int i=30;i>=0;i--)
{
if (s&(1<<i)) ch=1;
else ch=0;
if (p->ch[ch]) p->ch[ch]->val--;
p=p->ch[ch];
}
}

int solve(int n)
{
int ans=1;
for (int i=1;i<=n;i++) ans*=2;
return ans;
}

int qur(int s)
{
Trie *p=root;
int num,ans=0;
for (int i=30;i>=0;i--)
{
if (s&(1<<i)) num=0;
else num=1;
if (p->ch[num] && p->ch[num]->val)
{
ans+=solve(i);
p=p->ch[num];
}
else if (p->ch[!num]) p=p->ch[!num];
}
return ans;
}

void del(Trie *p)
{
for (int i=0;i<2;i++) if (p->ch[i]) del(p->ch[i]);
delete []p;
}

int main()
{
scanf("%d",&T);
while (T--)
{
root=new Trie;
for (int i=0;i<2;i++) root->ch[i]=NULL;
ans=0;
scanf("%d",&n);
for (int i=0;i<n;i++)
{
scanf("%d",&a[i]);
_insert(a[i]);
}
for (int i=0;i<n-1;i++)
{
_delete(a[i]);
for (int j=i+1;j<n;j++)
{
_delete(a[j]);
ans=max(ans,qur(a[i]+a[j]));
_insert(a[j]);
}
_insert(a[i]);
}
printf("%d\n",ans);
del(root);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: