2015ICPC长春站J题
给出一个长度为NNN的数组sss,求max(si+sj)⨁sk\max (s_i+s_j) \bigoplus s_kmax(si+sj)⨁sk,其中i,j,ki,j,ki,j,k互不相同,有多组数据
N≤1000N \leq 1000N≤1000
辣鸡数据裸O(n3)O(n^3)O(n3)能过
正解应该是把NNN个数插入01Trie中,询问时n2n^2n2枚举i,ji,ji,j,在Trie上删除si,sjs_i,s_jsi,sj后(因为要求k≠i,jk \neq i,jk=i,j),再跑一遍贪心求si+sjs_i+s_jsi+sj能异或得到的最大值,复杂度O(n2logn)O(n^2 \log n)O(n2logn)
比较基础的01Trie模板题
Code:
#include<bits/stdc++.h>
#define ll long long
#define clr(x,i) memset(x,i,sizeof(x))
using namespace std;
const int N=1005;
const ll mod=1e9+7;
inline int read()
{
int x=0,f=1; char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-') f=-1; ch=getchar();}
while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
return x*f;
}
int n,a[N],ch[N*N][2],siz[N*N],tot;
void ins(int x)
{
int now=0;
for(int i=30; i>=0; i--){
bool t=(1<<i)&x;
if(!ch[now][t]){
ch[now][t]=++tot;
ch[tot][0]=ch[tot][1]=0;
siz[tot]=0;
}
now=ch[now][t];
siz[now]++;
}
}
void del(int x)
{
int now=0;
for(int i=30; i>=0; i--){
bool t=(1<<i)&x;
now=ch[now][t];
siz[now]--;
}
}
int qry(int x)
{
int ret=0,now=0;
for(int i=30; i>=0; i--){
bool t=(1<<i)&x;
if(siz[ch[now][t^1]]) ret+=(1<<i),now=ch[now][t^1];
else now=ch[now][t];
}
return ret;
}
void solve()
{
n=read(); tot=0; ch[0][0]=ch[0][1]=siz[0]=0;
for(int i=1; i<=n; i++){
a[i]=read();
ins(a[i]);
}
int ans=0;
for(int i=1; i<=n; i++){
for(int j=i+1; j<=n; j++){
del(a[i]); del(a[j]);
ans=max(ans, qry(a[i]+a[j]));
ins(a[i]); ins(a[j]);
}
}
printf("%d\n",ans);
}
int main()
{
int T=read();
while(T--) solve();
}
/*
void bf()
{
n=read();
int ans=0;
for(int i=1; i<=n; i++) a[i]=read();
for(int i=1; i<=n; i++){
for(int j=i+1; j<=n; j++){
for(int k=1; k<=n; k++){
if(k==i || k==j) continue;
ans=max(ans, (a[i]+a[j])^a[k]);
}
}
}
printf("%d\n",ans);
}
*/
//一年多没有写过博客了啊,这一年将多少梦想化为了现实,又带着多少遗憾继续前往远方了呢?
2817

被折叠的 条评论
为什么被折叠?



