hdu5536 字典树xor

一想到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\n",ans);
        Del(trie);
    }
}

 

posted @ 2015-11-10 16:05  sweat123  阅读(160)  评论(0编辑  收藏  举报