标签:problem void strong turn getchar 最大值 query \n 不清楚
http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1216
Time Limit: 2 Sec Memory Limit: 128 Mb
Description
给定一些数,求这些数中两个数的异或值最大的那个值
Input
多组数据。第一行为数字个数n,1 <= n <= 10 ^ 5。接下来n行每行一个32位有符号非负整数。
Output
任意两数最大异或值
Sample Input
3
3
7
9Sample Output
14
Hint
Source
CSGrandeur的数据结构习题
/*
▍ ★∴
....▍▍....█▍ ☆ ★∵ ..../
◥█▅▅██▅▅██▅▅▅▅▅███◤
.◥███████████████◤
~~~~◥█████████████◤~~~~
*/
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
inline int read()
{
int x=0,f=1;char s=getchar();
while('0'>s||s>'9') {if(s=='-')f=-1;s=getchar();}
while('0'<=s&&s<='9') {x=x*10+s-'0';s=getchar();}
return x*f;
}
int n;
int a[100007];
inline int max(int a,int b) {return a>b?a:b;}
struct node{
int a,b;
}e[100007*20];
int tot=1;
inline void build(int x)
{
int p=1;
for(int i=30;i>=0;i--) {
int tmp=x&(1<<i);
if(tmp)
if(!e[p].a)
e[p].a=++tot,p=tot;
else p=e[p].a;
else
if(!e[p].b) e[p].b=++tot,p=tot;
else p=e[p].b;
}
}
inline int query(int x)
{
int p=1;
int ans=0;
for(int i=30;i>=0;i--) {
int tmp=x&(1<<i);
if(!tmp) {
if(e[p].a) p=e[p].a,ans+=(1<<i);
else p=e[p].b;
}
else {
if(e[p].b) p=e[p].b;
else p=e[p].a,ans+=(1<<i);
}
}
return ans^x;
}
int main()
{
while(scanf("%d",&n)==1) {
memset(e,0,sizeof(e));
int ans=-0x3f3f3f3f;
for(int i=1;i<=n;++i)
a[i]=read();
for(int i=1;i<=n;++i)
build(a[i]);
for(int i=1;i<=n;++i)
ans=max(ans,query(a[i]));
printf("%d\n",ans);
}
return 0;
}
标签:problem void strong turn getchar 最大值 query \n 不清楚
原文地址:https://www.cnblogs.com/lovedsr/p/9319770.html