【最大异或结点——Trie,创意】

题目

【最大异或结点——Trie,创意】_第1张图片

代码

#include 
using namespace std;
const int N = 1e5 + 10, M = 31e5 + 10;
int tr[M][2], idx, e[M]; //[maxn * maxb][changes]
int a[N];
vector v[N];
void add(int x)
{
    int p = 0;
    for (int i = 30; i >= 0; i--)
    {
        int u = (x >> i) & 1;
        if (!tr[p][u])
            tr[p][u] = ++idx;
        p = tr[p][u];
        e[p]++;
    }
}
void rem(int x)
{
    int p = 0;
    for (int i = 30; i >= 0; i--)
    {
        int u = (x >> i) & 1;
        p = tr[p][u];
        e[p]--;
    }
}
int findmax(int x)
{
    int retv = 0, p = 0;
    for (int i = 30; i >= 0; i--)
    {
        int u = (x >> i) & 1;
        if (tr[p][!u] && e[tr[p][!u]])
        {
            p = tr[p][!u];
            retv |= 1 << i;
        }
        else
            p = tr[p][u];
    }

    return retv;
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    
    int n;
    cin >> n;

    for (int i = 0; i < n; i++)
        cin >> a[i], add(a[i]);

    for (int i = 0; i < n; i++)
    {
        int fa;
        cin >> fa;
        if (fa == -1)
            continue;
        v[fa].push_back(i);
        v[i].push_back(fa);
        //v[i].push_back(i); 可留可不留
    }

    int ans = 0;
    for (int i = 0; i < n; i++)
    {
        for (auto u : v[i])
            rem(a[u]);
        ans = max(ans, findmax(a[i]));
        for (auto u : v[i])
            add(a[u]);
    }

    cout << ans;
    return 0;
}

你可能感兴趣的:(蓝桥杯,算法)