代码感悟
1. 最重要的一点是所有十进制数字都必须统一转化为31位的二进制数!!!
y总优美代码:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
const int N=1e7;
int son[N][2],index;
int a[N];
int n,m;
void insert(int x){
int p=0;
for(int i=30;i>=0;i--){
int te=x>>i&1;
if(!son[p][te]){
son[p][te]=++index;
}
p=son[p][te];
}
}
int query(int x){
int p=0;
int res=0;
for(int i=30;i>=0;i--){
int te=x>>i&1;
if(!son[p][!te]){
p=son[p][te];
}
else{
p=son[p][!te];
res+=1<<i;
}
}
return res;
}
int main(){
cin>>n;
int ma=0;
for(int i=0;i<n;i++){
int x;
cin>>x;
a[i]=x;
insert(x);
}
int anss=0;
for(int i=0;i<n;i++){
int x=a[i];
anss=max(anss,query(x));
}
cout<<anss<<endl;
return 0;
}
我的代码:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
const int N=1e7;
int son[N][2],cnt[N],index;
int a[N];
int n,m;
vector<int>ans;
void insert(int x){
int p=0;
string str;
while(x){
int temp=x%2;
str+=temp+'0';
x/=2;
}
int ss=str.size();
if(ss<m){
for(int i=1;i<=m-ss;i++){
str+='0';
}
}
reverse(str.begin(),str.end());
for(int i=0;i<str.size();i++){
int temp=str[i]-'0';
if(!son[p][temp]){
son[p][temp]=++index;
}
p=son[p][temp];
}
}
int query(int x){
ans.clear();
int p=0;
int q=x;
string str;
while(x){
int temp=x%2;
str+=temp+'0';
x/=2;
}
int ss=str.size();
if(ss<m){
for(int i=1;i<=m-ss;i++){
str+='0';
}
}
reverse(str.begin(),str.end());
for(int i=0;i<str.size();i++){
int temp=str[i]-'0';
if(!son[p][!temp]){
if(son[p][temp]){
ans.push_back(0);
p=son[p][temp];
}
else{
ans.push_back(temp^0);
}
}
else{
p=son[p][!temp];
ans.push_back(1);
}
}
int res=0;
for(auto &t:ans){
res=res*2+t;
}
return res;
}
int main(){
cin>>n;
int ma=0;
for(int i=0;i<n;i++){
int x;
cin>>x;
a[i]=x;
ma=max(ma,x);
}
while(ma){
m++;
ma/=2;
}
for(int i=0;i<n;i++){
insert(a[i]);
}
int anss=0;
for(int i=0;i<n;i++){
int x=a[i];
anss=max(anss,query(x));
}
cout<<anss<<endl;
return 0;
}