RT。怎么卡空间?
#include<iostream>
using namespace std;
const int N=1e6+10;
int n,k,a[N];
int t[N][2],tot=1;
int d[N],f[N],siz[N];
inline void insert(int v){
int u=1;
for(int i=19;i>=0;i--){
int a=v>>i&1;
if(t[u][a]==0){
t[u][a]=++tot;
}
u=t[u][a];
}
siz[u]++;
}
inline void dfs(int u){
if(!t[u][0]){
if(!t[u][1]){
f[u]=siz[u];
return;//叶子结点直接返回
}
}
int v=0;
for(int i=0;i<=1;i++){
if(!t[u][i])continue;
v=t[u][i];
d[v]=d[u]-1;
dfs(v);
siz[u]+=siz[v];
}
if(k>>d[u]&1){
//k的d[u]为1,可以取反继续访问或者直接相同不再遍历
f[u]=max(f[t[u][0]]+siz[t[u][1]],f[t[u][1]]+siz[t[u][0]]);
}
else{//否则只能取相同,左右两边取较大值
f[u]=max(f[t[u][0]],f[t[u][1]]);
}
}
int main(){
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>a[i];
insert(a[i]);
}
d[1]=19;
dfs(1);
cout<<f[1];
return 0;
}