💭 💭 💭
题意:给两个数组A,P,P可重新排列,问你两个数组异或得到的最小字典序数组
将P插入字典树,1~n遍历A,对每个A贪心即可
qwq五一讲课拿这个做板题吧
const int MX = 3e5 + 10;
int a[MX],p[MX];
int tot,son[MX*33][2],cnt[MX*33];
void build(int x,int i)
{
int p=0;
for(int k=30;k>=0;--k)
{
int tmp=((x&(1ll<<k))==0?0:1);
if(!son[p][tmp]) son[p][tmp]=++tot;
p=son[p][tmp];
++cnt[p];//计数,删除某数用
}
}
int ans[MX];
void que(int x,int i)
{
int p=0;
int tmp=0;
for(int k=30;k>=0;--k)
{
if(x&(1<<k))//1
{
if(cnt[son[p][1]]) p=son[p][1];
else p=son[p][0],tmp|=1<<k;
}
else
{
if(cnt[son[p][0]]) p=son[p][0];
else p=son[p][1],tmp|=1<<k;
}
--cnt[p];
}
ans[i]=tmp;
}
signed main()
{
int n;cin>>n;
rpp(i,n) cin>>a[i];
rpp(i,n) cin>>p[i];
rpp(i,n) build(p[i],i);
rpp(i,n) que(a[i],i);
rpp(i,n) cout<<ans[i]<<" ";
cout<<endl;
stop;
return 0;
}