【题解】LOJ6144 C
考虑只有询问的情况,经典的主席树/可持久化01trie,考虑有位运算大概是在 01trie 上搞事,于是对于每一位考虑其对 01trie 的影响。
或:或 0 没用,或 1 等价于把当前位的所有点左儿子合并到右边。
与:与 1 没用,或 0 等价于把当前位的所有点右儿子合并到左边。
异或:异或 0 没用,异或 1 等价与把当前位的所有点交换左右儿子。
于是发现合并儿子后就空了一边,再合并就是交换位置,所以每一位等于是只和并一次。
易发现交换位置很容易能在查询时特判,换个边就好了。
所以每次需要合并时暴力重新建 01trie,然后记录每一位是否相同、相同时是 0 还是 1、是否交换就能直接查了(代码中分别为 sam,whi,rev
(same,which,reverse))。
我写的实现是合并统一合到右子树,算答案时用看 whi
标记是 0 还是 1,有 rev
的位就当做左右子树反了的做,具体实现见代码。
时间复杂度:最多暴力重构 \(O(\log A)\) 次,每次 \(O(n\log A)\),不重构的修改 \(O(1)\),询问 \(O(\log A)\),总复杂度为 \(O(n\log^2 A + m\log A)\)(\(A\) 为值域)。