现场想到了lowbit(X xor Y)=X和Y从右向左数,对应相同的数的个数+1。。。然而并没有想到接下来用trie树
然后就想排个序试试。。。然后就整个人都不好了啊摔
sol:用trie,一边insert一边输出答案
找出Ai的二进制数翻转后在字母树上的路径,对于路径上每个点x,设他走的边是v,且当前为第k位,则和他xor后lowbit为2k的数的个数为trans(x,v^1)的子树大小。
注意这里v=0or1,即可以取的字符。
仿照lrj的模板写了一次。。结果写残了233。因为没有考虑好0这种情况
lrj模板里插入的都是字符串,不会存在0(也就是空)的情况。然而要想插入数字0就完蛋了
1 int Insert(LL X) 2 { 3 int u=0,dep=1; 4 while(X!=0) 5 { 6 int c=(X&1)+1; 7 X=X>>1; 8 if(!ch[u][c]) 9 { 10 memset(ch[sz],0,sizeof(ch[sz])); 11 ch[u][c]=sz; 12 sz++; 13 } 14 val[u]++; 15 dp[u]=dep; 16 dep++; 17 f[ch[u][c]]=u; 18 u=ch[u][c]; 19 } 20 return u; 21 }