一想到xor还要求最大类似的题,字典树效率高。
此代码c++ TLE。
#include<stdio.h> #include<string.h> const int maxn = 1010; struct node { int num; node *next[2]; void init() { next[0]=next[1]=NULL; num=0; } }; node *trie,*p=NULL; int a[maxn],b[maxn],n; int max(int x,int y) { return x>y?x:y; } void init() { trie=new node; trie->init(); } void add(int x) { p=trie; int i,j; for(i=30;i>=0;i--) { int t; if(x&(1<<i)) t=1; else t=0; if(t) { if(p->next[t]==NULL) { node *q=new node; q->init(); p->next[t]=q; } p=p->next[t]; p->num++; } else { if(p->next[t]==NULL) { node *q=new node; q->init(); p->next[t]=q; } p=p->next[t]; p->num++; } } } void Del(int x) { p=trie; int i; for(i=30;i>=0;i--) { int t; if(x&(1<<i)) t=1; else t=0; p=p->next[t]; p->num--; } } int query(int x) { p=trie; int fx=0; for(int i=30;i>=0;i--) { int t; if(x&(1<<i))t=1; else t=0; if(t) { if(p->next[0]!=NULL&&p->next[0]->num!=0) { p=p->next[0]; } else { fx=fx^(1<<i); p=p->next[1]; } } else { if(p->next[1]!=NULL&&p->next[1]->num!=0) { fx=fx^(1<<i); p=p->next[1]; } else p=p->next[0]; } } return fx; } void Del(node *trie) { for(int i=0;i<=1;i++) { if(trie->next[i]) Del(trie->next[i]); } delete trie; } int main() { int i,j,t; scanf("%d",&t); while(t--) { init(); scanf("%d",&n); for(i=0;i<n;i++) { scanf("%d",&a[i]); add(a[i]); } int ans=0; for(i=0;i<n;i++) { for(j=0;j<n;j++) { if(i==j) continue; Del(a[i]); Del(a[j]); int fp=a[i]+a[j]; int ret=query(fp); //printf("%d ",ret); ans=max(ans,fp^ret); add(a[i]); add(a[j]); } } printf("%d ",ans); Del(trie); } }