AGC064C Erase and Divide Game
首先考虑你只插入若干个数怎么做:按位从低到高插入一棵 Trie,问题就变成:在 Trie 上每次可以往左儿子走或者往右儿子走,如果当某个人操作的时候为空节点那么这个人就输了。
如果我们可以将这棵树建出来那么这个问题就是好解决的,可惜建不出来。仿照从高到低建 Trie 的方法,将其二进制拆分成若干个段 \([l,l+2^k-1]\),且满足 \(l\bmod 2^k=0\)。那么这在从低到高的 Trie 上表现就是:前 \(k\) 层是满的,后面每个都是相同的一个。更进一步的,对于每个 \(k\) 建立一棵这样的 Trie,那么在第 \(i\) 棵 Trie 上,前 \(i\) 步不动,后 \(i\) 步正常走。
如果直接这样走,状态数显然不会超过 \(n\log ^2V\),只需要有一个合适的方法记录状态即可,使用 xor-hash,给每个点赋值一个点权,如果所有 xor 起来相等就认为相等,错误概率仅有 \(2^{-64}\),可以接受。这样直接记搜,时间复杂度 \(O(n\log ^3a+n\log ^2a\log n)\)。