CF888G Xor-MST 异或MST

#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cctype>
#include<cstdio>
#include<vector>
#include<string>
#include<queue>
#include<stack>
#include<cmath>
#include<map>
#include<set>
using namespace std;
const int inf=0x7fffffff;
const double eps=1e-10;
const double pi=acos(-1.0);
inline int read()
{
    int x=0,f=1;
    char ch;
    ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-') f=0;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9')
    {
        x=(x<<1)+(x<<3)+(ch&15);
        ch=getchar();
    }
    if(f)return x;
    else return -x;
}
struct Trie
{
    int son[2][200000*30+10],tot;
    void Insert(int a)
    {
        int now=0,id;
        for(int i=30; i>=0; i--)
        {
            id=(a>>i)&1;
            if(!son[id][now])son[id][now]=++tot;
            now=son[id][now];
        }
    }
    int Find(int r1,int r2,int b)
    {
        if(b<0) return 0;
        int a1=-1,a2=-1;
        if(son[0][r1]&&son[0][r2]) a1=Find(son[0][r1],son[0][r2],b-1);
        if(son[1][r1]&&son[1][r2]) a2=Find(son[1][r1],son[1][r2],b-1);
        if(~a1&&~a2) return min(a1,a2);
        if(~a1) return a1;
        if(~a2) return a2;
        if(son[1][r1]&&son[0][r2]) a1=Find(son[1][r1],son[0][r2],b-1)+(1<<b);
        if(son[0][r1]&&son[1][r2]) a2=Find(son[0][r1],son[1][r2],b-1)+(1<<b);
        if(~a1&&~a2) return min(a1,a2);
        if(~a1) return a1;
        if(~a2) return a2;
    }
} T;
long long ans;
void dfs(int a,int b)
{
    if(b<0) return;
    if(T.son[0][a]&&T.son[1][a]) ans+=1ll*T.Find(T.son[0][a],T.son[1][a],b-1)+(1ll<<b);
    if(T.son[0][a]) dfs(T.son[0][a],b-1);
    if(T.son[1][a]) dfs(T.son[1][a],b-1);
}
int n,v;
int main()
{
    n=read();
    for(int i=1; i<=n; i++)T.Insert(read());
    dfs(0,30);
    printf("%I64d\n",ans);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/QingyuYYYYY/p/13380094.html