HDU 5536 Chip Factory(01Trie)

目录

Description

? 有 n 个数,求 $ max((a[i] + a[j]) ⊕ a[k]) $ ,其中 \(i, j, k\) 互不相同

State

? 测试样例 $ 1<=T<=1000 $
? $ 3<=n<=1000 $
? $ 0<=a[i]<=1e9 $

Input

2
3
1 2 3
3
100 200 300

Output

6
400

Solution

题目 n 并不是很大,所以推测算法复杂度为 \(O(n^2logn)\)
其中枚举 \(a[i] + a[j]\) 复杂度为 \(O(n^2)\)
再找一个数 x ,使得 \((a[i] + a[j]) ⊕ x\) 最大,利用 01Trie,复杂度为 O(logA)

Code


   const int N = 4e5 + 5;

    ll n, m, _;
    int i, j, k;
    ll a[N];
    int ch[N * 30][2], sz[N * 30];
    int tot = 0;

void ins(int x)
{
    int rt = 0;
    for(int i = 30; ~i; i --){
        int id = (x >> i) & 1;
        if(ch[rt][id] == 0){
            ch[rt][id] = ++ tot;
        }
        rt = ch[rt][id];
        sz[rt] ++;
    }
    return void();
}

void update(int x, int c)
{
    int rt = 0;
    for(int i = 30; ~i; i --){
        int id = (x >> i) & 1;
        rt = ch[rt][id];
        sz[rt] += c;
    }
    return void();
}

ll query(ll x)
{
    int rt = 0;
    ll ans = 0;
    for(int i = 30; ~i; i --){
        int id = (x >> i) & 1;
        if(sz[ch[rt][!id]]){
            rt = ch[rt][!id];
            ans |= (1 << i);
        }
        else{
            rt = ch[rt][id];
        }
    }
    return ans;
}

void clear()
{
    for(int i = 0; i <= tot; i ++){
        ch[i][0] = ch[i][1] = 0;
        sz[i] = 0;
    }
    tot = 0;
    return void();
}

signed main()
{
    //IOS;
    rush(){
        sd(n);
        rep(i, 1, n){
            sd(a[i]);
            ins(a[i]);
        }
        ll maxx = 0;
        rep(i, 1, n){
            rep(j, i + 1, n){
                update(a[i], -1);
                update(a[j], -1);
                maxx = max(maxx, query(a[i] + a[j]));
                update(a[i], 1);
                update(a[j], 1);
            }
        }
        pd(maxx);
        clear();
    }
    return 0;
}

HDU 5536 Chip Factory(01Trie)

上一篇:测试数据


下一篇:[SAA + SAP] 17. RDS - Aurora