• 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
    ",ans);
            Del(trie);
        }
    }
  • 相关阅读:
    【原创】ZYNQ学习笔记(一) HelloWorld实现
    设置毛玻璃效果
    什么是UIImageView
    短信监听器
    内容观察者
    插入联系人
    UIFont
    什么是UILabel
    读取联系人案例
    利用内容提供者插入短信
  • 原文地址:https://www.cnblogs.com/sweat123/p/4953355.html
Copyright © 2020-2023  润新知