Trie AcWing 143. 最大异或对

Trie AcWing 143. 最大异或对

原题链接

AcWing 143. 最大异或对

算法标签

Trie 字典树 贪心

思路

首先考虑暴力做法

代码

#include
#define int long long
#define rep(i, a, b) for(int i=a;ib;--i)
using namespace std;
const int N = 100005;
int a[N];
inline int read(){
   int s=0,w=1;
   char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
   while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
   return s*w;
}
void put(int x) {
    if(x<0) putchar('-'),x=-x;
    if(x>=10) put(x/10);
    putchar(x%10^48);
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int n=read();
	int ans=0;
	rep(i, 0, n){
	    a[i]=read();
	}
	while(n--){
	    rep(i, 0, n){
	        rep(j, i, n){
	            ans=max(ans, a[i]^a[j]);
	        }
	    }
	}
	printf("%lld", ans);
}

优化

对于每个a[i], 在选取a[j]时, 应该尽量选取在二进制下与a[i]在该位不同的a[j], 保证结果尽可能大, 若不存在在二进制下与a[i]在该位不同的a[j], 则只能暂时选取在该位相同的a[j]
Trie AcWing 143. 最大异或对_第1张图片
举例
Trie AcWing 143. 最大异或对_第2张图片

代码

#include
#define int long long
#define rep(i, a, b) for(int i=a;ib;--i)
using namespace std;
const int N = 100005;
int son[N][2], a[N], idx;
inline int read(){
   int s=0,w=1;
   char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
   while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
   return s*w;
}
void put(int x) {
    if(x<0) putchar('-'),x=-x;
    if(x>=10) put(x/10);
    putchar(x%10^48);
}
void insert(int x){
    int p=0;
    Rep(i, 30, -1){
        int u=x>>i&1;
        if(!son[p][u]){
            son[p][u]=++idx;
        }
        p=p[son][u];
    }
}
int search(int x){
    int p=0, res=0;
    Rep(i, 30, -1){
        int u=x>>i&1;
        if(son[p][!u]){
            res+=1<

原创不易
转载请标明出处
如果对你有所帮助 别忘啦点赞支持哈
在这里插入图片描述

你可能感兴趣的:(算法,算法,c++,贪心算法)