列表

详情


NC50342. Nikitosh 和异或

描述

给定一个含N个元素的数组A,下标从1开始。请找出下面式子的最大值:,其中表示x和y的按位异或。

输入描述

输入数据的第一行包含一个整数N,表示数组中的元素个数。
第二行包含N个整数

输出描述

输出一行包含给定表达式可能的最大值。

示例1

输入:

5
1 2 3 1 2

输出:

6

说明:

满足条件的(l_1,r_1,l_2,r_2)有:(1,2,3,3),(1,2,4,5),(3,3,4,5)。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 607ms, 内存消耗: 31332K, 提交时间: 2022-05-22 09:18:51

#include<bits/stdc++.h>
using namespace std;
int t,n,ans=0;
const int N=1e6+5;
string s;
int tr[N<<5][2],cnt=0,a[N];
int l[N],r[N];
void ins(int x){
	int u=0;
	for(int i=30;i>=0;i--){
		int k=(x>>i)&1;
		if(!tr[u][k])
            tr[u][k]=++cnt;
		u=tr[u][k];
	}
	return;
}
int query(int s)
{
	int u=0;
	int x=0;
	for(int i=30;i>=0;i--)
    {
		int k=(s>>i)&1;
		if(tr[u][!k]){
			x+=1<<i; 
			u=tr[u][!k];
		}
		else
			u=tr[u][k];
	}
	return x;
} 
int main(){
    cin>>n;
	for(int i=1; i<=n; i++)
    {
        cin>>a[i];
		ins(a[i]);
	}
	for(int i=1;i<=n;i++)
		l[i]=max(l[i-1],query(a[i]));
	for(int i=n;i>=1;i--)
		r[i]=max(r[i+1],query(a[i]));
	for(int i=1;i<=n;i++)
		ans=max(ans,l[i]+r[i+1]);
	printf("%d",ans);
}

C++(g++ 7.5.0) 解法, 执行用时: 378ms, 内存消耗: 26992K, 提交时间: 2023-07-29 12:36:28

#include<bits/stdc++.h>
using namespace std;
const int N=4e5+10;
int tr[2][N*30];
int idx;
void insert(int x){
    int p=0;
    for(int i=30;i>=0;i--){
          int u=(x>>i)&1;
        if(!tr[u][p])tr[u][p]=++idx;
        p=tr[u][p];
    }
}
int ask(int x){
    int p=0,ans=0;
    for(int i=30;i>=0;i--){
        int u=(x>>i)&1;
        if(tr[u^1][p])p=tr[u^1][p],ans+=(1<<i);
        else p=tr[u][p];
    }
    return ans;
}
int main(){
    int n;cin>>n;
    insert(0);int maxx=0;
    int pre=0;
    for(int i=1;i<=n;i++){
        int x;cin>>x;
        pre^=x;
        maxx=max(maxx,ask(pre));
        insert(pre);
    }
    cout<<2*maxx;
    
    return 0;
}

上一题