zoukankan      html  css  js  c++  java
  • 【trie树】the xor largest pair

    LOJ #10050. The XOR Largest Pair

    trie树三连击biu~

    《进阶指南》P72 例题

    思路与上题无异, 只细节不同qaq

    1. 分解二进制,高位在前, 建立trie树(0/1)
    2. search操作:首选不同的(xor值才能大), 就等于在后面加了一个1, 所以 sum = (sum<<1)|1
    3. 如果没有不同的, 就等于在后面加了一个0, 所以 sum = (sum<<1);
    4. (唔为什么变紫色了啊啊啊
    5. 如果从32开始枚举, 爆int 记得开long long , (gjh:多枚举几位, 开个long long保险啊! )这题从31开始也可以, 只要int即可
    6. 后面search(a[i]) 写成search(i) 可还行QAQ

    代码上!

     1 #include<cstdio>
     2 #include<iostream>
     3 using namespace std;
     4 const int sz = 100010;
     5 int n, tot = 0;
     6 int trie[sz*32][2], a[sz];
     7 void insert(int x) {
     8     int root = 0;
     9     for(int i = 31; i >= 0; i--) {
    10         int id = (x>>i)&1;
    11         if(!trie[root][id]) trie[root][id] = ++tot;
    12         root = trie[root][id];
    13     }
    14 }
    15 int search(int x) {
    16     int root = 0, sum = 0;
    17     for(int i = 31; i >= 0; i--) {
    18         int id = (x>>i)&1;
    19         if(trie[root][id^1]) {
    20             root = trie[root][id^1];
    21             sum = (sum<<1)|1;
    22         }
    23         else {
    24             root = trie[root][id];
    25             sum = sum<<1;
    26         }
    27     }
    28     return sum;
    29 }
    30 int main() {
    31     int ans = 0;
    32     scanf("%d", &n);
    33     for(int i = 1; i <= n; i++) {
    34         scanf("%d", &a[i]);
    35         insert(a[i]);
    36     }
    37     for(int i = 1; i <= n; i++) {
    38         if(search(a[i])>ans) {
    39             ans = search(a[i]);
    40         }
    41     }
    42     printf("%d
    ", ans);
    43     return 0;
    44 }
    总之岁月漫长,然而值得期待。
  • 相关阅读:
    java注解
    SpringBoot 整合 MybatisPlus 3.0
    第三章 列表简介
    第二章 变量及简单数据类型
    收藏通俗知识
    2017.8.13 列标,元组,字符串
    Python入门--4--分之和循环
    Python入门---易错已错易混淆----知识点
    Perl语言入门--4--函数
    perl学习之精髓中的精髓
  • 原文地址:https://www.cnblogs.com/Hwjia/p/9800566.html
Copyright © 2011-2022 走看看