01字典树在异或问题的查询上十分高效。
01字典树是按位插入和查询的。因为如果一个数,它的高位值较大,那么这个数的值较大。所以我们插入和查询时是从最高位开始进行的。
可以开一个辅助数组val来记录原数值。
插入:
#define ll long long
int n,m;
int trie[32*MAXN][2];
ll val[32*MAXN];
int tot;
void insert(ll d)
{
int root=0;
for(int i=32;i>=0;i--)
{
int id=(d>>i)&1;//获得这一个bit位的值
if(!trie[root][id]) trie[root][id]=++tot;
root=trie[root][id];
}
val[root]=d;
}
查询:
ll query(ll d)
{
int root=0;
for(int i=32;i>=0;i--)
{
int id=(d>>i)&1;
if(trie[root][id^1]) root=trie[root][id^1];
else root=trie[root][id];
}
return val[root];
}