1. 程式人生 > 實用技巧 >CF888G Xor-MST 異或MST

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; }