算法标签 Trie字典树贪心

来源 《算法竞赛进阶指南》

题目简叙

[AcWing]143. 最大异或对_ci

思路

使用二叉树的结构来表示整个插入和查询过程:

[AcWing]143. 最大异或对_ios_02

代码

#include<iostream>

using namespace std;
const int N=1e5+10;
int tree[N*31][2];
int idx,p;

void insert(int x){
p=0;
for(int i=30;~i;i--){//这里是30的原因是因为限制从0到30,我们采用高位优先,这样可以从大值直接判断
int u=x>>i&1;//获取当前位置上的二进制数值
if(!tree[p][u])tree[p][u]=++idx;//如果不存在,则创建,并指向下一个位置
p = tree[p][u];//移动下一个位置
}
}

int query(int x){
p=0;
int tmpres=0;//用来表示与X异或操作的最大的值
for(int i=30;~i;i--){
int u=x>>i&1;
if(tree[p][!u]){//如果存在和当前U相反的值,就选取,这样数值会更大
tmpres=tmpres*2+!u;//tmpres为二进制状态,进一位+(!u)
p =tree[p][!u];//移动到下一个
}
else {
tmpres=tmpres*2+u;
p =tree[p][u];
}
}

return (tmpres^=x);//两个值进行异或操作
}

int main(){
int n;
cin>>n;

int tmp;
int res=0;
while(n--){
cin>>tmp;
insert(tmp);
res=max(res,query(tmp));//用res维护一个最大值
}

cout<<res;

return 0;
}

AC记录

[AcWing]143. 最大异或对_ios_03