D. Dr. Evil Underscores
看完题发现是异或 不难按位考虑
观察样例发现好像要是只要是一个分支的时候就可以为消除这一位的影响
我们直接建出字典树
发现要是该位只有一个分支我们显然可以选择与此分支相同的消除这一位的影响
要是不同 我们就相当于 选择进一个分支 这就是我们的dp了
dp[u]表示该子树的min 这里我们直接递归的时候维护dp[u]即可
const int MAXN = 5e5 + 5;
int son[MAXN*30][2], idx;
int MAXBIT = 30,st[31];
void init(){
son[0][0] = son[0][1] = 0;
idx = 1;
}
void add(int n){
int p = 0;
for (int i = MAXBIT; i >= 0; --i){
int u = (n >> i) & 1;
if (!son[p][u]) {
son[idx][0] = son[idx][1] = 0;
son[p][u] = idx++;
}
p = son[p][u];
}
}
int dp(int p,int w){
if(w<0)return 0;
if(son[p][0]&&son[p][1]){
return (1<<w)+min(dp(son[p][0],w-1),dp(son[p][1],w-1));
}else if(son[p][0]){
return dp(son[p][0],w-1);
}else{
return dp(son[p][1],w-1);
}
}
void solve(){
int n;cin>>n;
init();
vector<int>a(n+1);
for(int i=1;i<=n;i++)cin>>a[i],add(a[i]);
cout<<dp(0,30)<<endl;
}
标签:idx,int,613,Codeforces,son,Div,dp,分支
From: https://www.cnblogs.com/ycllz/p/16923270.html