• 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);
        }
    }
  • 相关阅读:
    VMware Workstation 15 安装教程
    Kail更新源、输入法、浏览器
    Kali Linux 下载、引导、安装
    dwr超时
    jsp获取web的跟路径
    java线程安全
    jsp快速回顾
    在web.xml中可以设置jsp标签吗?
    axis2--生成的wsdl文件方法的参数问题
    java删除文件
  • 原文地址:https://www.cnblogs.com/sweat123/p/4953355.html
Copyright © 2020-2023  润新知