• 【HDOJ5536】Chip Factory(Trie树)


    题意:给定n个数字,第i个数字为a[i],求max((a[i]+a[j])^a[k]),其中i,j,k互不相同

    n<=1000,0<=a[i]<=1e9

    思路:队友写的,抱大腿

    先对于a[i]建立Trie树

    枚举i和j后删除Trie中的i和j,然后就是经典的Trie树应用:优先朝与a[i]+a[j]的当前位不同的方向走,能获得最大xor和

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define LL long long  
     4 const int maxn=1e3+5;
     5 int a[maxn*maxn][2];
     6 int b[maxn],num[maxn*maxn*2],tot;
     7 void init()
     8 {
     9     tot=1;
    10 }
    11 void insert (int x)
    12 {
    13     int rt=1;
    14     for(int i=30;i>=0;i--)
    15     {
    16         int g=(x>>i)&1;
    17         if(a[rt][g]==0)
    18         {
    19             a[rt][g]=++tot;
    20         }
    21         rt=a[rt][g];
    22         num[rt]++;
    23     }
    24 }
    25 void del(int x)
    26 {
    27     int rt=1;
    28     for(int i=30;i>=0;i--)
    29     {
    30         int g=(x>>i)&1;
    31         rt=a[rt][g];
    32         num[rt]--;
    33     }
    34 }
    35 int find(int x)
    36 {
    37     int rt=1;
    38     int sum=0;
    39     for(int i=30;i>=0;i--)
    40     {
    41         int g=(x>>i)&1;
    42     //    printf("%d %d %d
    ",g,a[rt][!g],a[rt][g]);
    43         if(a[rt][!g]==0||num[a[rt][!g]]==0)
    44         {
    45             rt=a[rt][g];
    46         }
    47         else
    48         {
    49         //    printf("i = %d
    ",i);
    50             rt=a[rt][!g];
    51             sum+=1<<i;
    52         }
    53         //printf("%d
    ",sum);
    54     }
    55     return sum;
    56 }
    57 int main()
    58 {
    59     int T;
    60     scanf("%d",&T);
    61     while(T--)
    62     {
    63         init();
    64         int n;
    65         scanf("%d",&n);
    66         for(int i=1;i<=n;i++)
    67         {
    68             scanf("%d",&b[i]);
    69             insert(b[i]);
    70         }
    71         int ma=0;
    72         for(int i=1;i<=n;i++)
    73             for(int j=i+1;j<=n;j++)
    74             {
    75                 del(b[i]);
    76                 del(b[j]);
    77             //    printf("%d
    ",find(b[i]+b[j]));
    78             //    puts("sdadas");
    79                 ma=max(ma,find(b[i]+b[j]));
    80                 insert(b[i]);
    81                 insert(b[j]);
    82             }
    83         for(int i=0;i<=tot;i++)
    84         {
    85             a[i][0]=a[i][1]=0;
    86             num[i]=0;
    87         }
    88         printf("%d
    ",ma);
    89     }
    90 }
  • 相关阅读:
    CF1480
    网络编程中常见地址结构与转换(IPv4/IPv6)
    inet_pton, inet_ntop
    mktime 夏令时
    C/C++中volatile关键字详解
    STL之vector容器详解
    Linux学习--gdb调试
    Linux编程基础——GDB(设置断点)
    FTP模式简式:PORT/PASV/EPRT/EPSV
    strchr和strstr 函数
  • 原文地址:https://www.cnblogs.com/myx12345/p/9879332.html
Copyright © 2020-2023  润新知