zoukankan      html  css  js  c++  java
  • hdu 5536 xor题

    input

    1<=T<=1000

    3<=n<=1000

    s1 s2 ... sn 0<=si<=10e9

    最多十个样例n>=100

    output

    max((a[i]+a[j])^a[k]) i!=j!=k

    做法,将s数组建成一颗01字典树,枚举a[i]+a[j]找最大,找之前要把a[i]和a[j]删掉,找完后再插入

      1 #include <cstdio>
      2 #include <queue>
      3 #include <cstring>
      4 #include <iostream>
      5 #include <cstdlib>
      6 #include <algorithm>
      7 #include <vector>
      8 #include <map>
      9 #include <set>
     10 #include <ctime>
     11 #define bit 31
     12 
     13 using namespace std;
     14 
     15 struct node
     16 {
     17     int c,l,r;
     18 };
     19 
     20 node a[40000];
     21 int s[1010],n,T;
     22 
     23 void erase(int x)
     24 {
     25     int u=0;
     26     for(int i=bit;i>=0;i--)
     27     {
     28         if(x&(1<<i))
     29         {
     30             u=a[u].r;
     31             a[u].c--;
     32         }
     33         else
     34         {
     35             u=a[u].l;
     36             a[u].c--;
     37         }
     38     }
     39 }
     40 
     41 void insert(int x)
     42 {
     43     int u=0;
     44     for(int i=bit;i>=0;i--)
     45     {
     46         if(x&(1<<i))
     47         {
     48             u=a[u].r;
     49             a[u].c++;
     50         }
     51         else
     52         {
     53             u=a[u].l;
     54             a[u].c++;
     55         }
     56     }
     57 }
     58 
     59 int find(int x)
     60 {
     61     int ans=0,u=0;
     62     for(int i=bit;i>=0;i--)
     63     {
     64         if(x&(1<<i))//bit位为1
     65         {
     66             if(a[u].l&&a[a[u].l].c)//能往左走就加1<<i
     67             {
     68                 ans+=1<<i;
     69                 u=a[u].l;
     70             }
     71             else u=a[u].r;//不能往左走就往右走
     72         }
     73         else
     74         {
     75             if(a[u].r&&a[a[u].r].c)
     76             {
     77                 ans+=1<<i;
     78                 u=a[u].r;
     79             }
     80             else u=a[u].l;
     81         }
     82     }
     83     return ans;
     84 }
     85 
     86 int main()
     87 {
     88     freopen("/home/user/桌面/in","r",stdin);
     89     scanf("%d",&T);
     90     while(T--)
     91     {
     92         scanf("%d",&n);
     93         memset(a,0,sizeof(a[0])*(n+2)*31);
     94         int root,idx=1,maxd=-1;
     95         for(int i=0;i<n;i++)//建树
     96         {
     97             scanf("%d",&s[i]);
     98             root=0;
     99             for(int j=bit;j>=0;j--)
    100             {
    101                 if(s[i]&(1<<j))
    102                 {
    103                     if(!a[root].r) a[root].r=idx++;
    104                     root=a[root].r;
    105                     a[root].c++;
    106                 }
    107                 else
    108                 {
    109                     if(!a[root].l) a[root].l=idx++;
    110                     root=a[root].l;
    111                     a[root].c++;
    112                 }
    113             }
    114         }
    115 //        for(int i=0;i<idx;i++) printf("%d %d %d
    ",a[i].c,a[i].l,a[i].r);
    116 //        printf("%d
    ",idx);
    117         for(int i=0;i<n;i++)
    118         {
    119             erase(s[i]);
    120             for(int j=i+1;j<n;j++)
    121             {
    122                 erase(s[j]);
    123                 maxd=max(find(s[i]+s[j]),maxd);
    124                 insert(s[j]);
    125             }
    126             insert(s[i]);
    127         }
    128         printf("%d
    ",maxd);
    129     }
    130     //printf("time=%.3lf",(double)clock()/CLOCKS_PER_SEC);
    131     return 0;
    132 }
    View Code
  • 相关阅读:
    修改centos7 DNS
    group by
    Oracle 删除表空间
    Oralce查看sid 、service_name
    Mysql修改lower_case_table_names
    Oralce静默安装
    Linux安装Mysql
    dbvisualier破解及使用
    Oracle扩容表空间
    lvm方式挂载盘及扩容
  • 原文地址:https://www.cnblogs.com/cdyboke/p/4929210.html
Copyright © 2011-2022 走看看