NC50342. Nikitosh 和异或
描述
输入描述
输入数据的第一行包含一个整数N,表示数组中的元素个数。
第二行包含N个整数。
输出描述
输出一行包含给定表达式可能的最大值。
示例1
输入:
5 1 2 3 1 2
输出:
6
说明:
满足条件的有:(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; }