这个好吃,但一个人很容易吃腻,我认为需要找人同你一起吃。
和根号重构思想是差不多的,就是每隔多少个重构一下。具体来说,二进制分组的过程类似 2048,其遵循如下的过程:
$$[1],[1,1]\to[2],[2,1],[2,1,1]\to[2,2]\to[4]$$
即每次新增元素至末尾,只要末尾元素个数与前驱相同,就不断合并至不同为止。每个元素至多会被合并 $\mathcal O(\log n)$ 次。
CF710F
维护一个支持删除、插入串以及查询某个串在给出所有串出现次数的数据结构。
注意这个删除操作是假的,可以维护两个 ACAM。插入操作直接插入第一个 ACAM,删除操作相当于插入第二个 ACAM。查询时就是两个 ACAM 的差。
考虑用二进制分组来维护这个过程,合并两个 ACAM 的过程是 $\mathcal O(\sum s_i)$ 的,总复杂度是线性对数。