D. 字符串
比较接近.
思路
直接判断是 \(\mathcal{O}(n^2m)\) 的, 考虑用桶记录.
对于 \(m = 1\) 的情况, 我们用桶记录一下当前的 ?
个数和各个字母出现次数即可.
拓展一下, 对于 \(m > 1\) 的情况, 对于一个字符串, 有用的位其实只有字母位 \((\)因为 ?
可以随便填\()\), 由于 \(m \le 6\), 所以我们可以考虑将这些位状压成一个数. 其中 1 表示这一位已经确定了, 0 表示是 ?
.
先考虑查询. 想一下什么类型的字符串可以变成 a?b?c
, 显然, 只有 10101 的子集可以匹配上. 我们在存储时只关注是 1 的位, 将 a?b?c
存储进 10101 中, 实际上我们就只需要将 abc
存进去即可. 那么我们要查询的就是 abc, ab?, a?c, ?bc, a??, ?b?, ??c, ???
这些, 可以发现就是对应 10101 的子集.
- 例如在查找 10100 这个子集, 也就是
ab?
时, 我们只需要在下标为 10101 的map
中查找键值为ab?
的数即可.
再说说修改, 在加入一个字符串的时候, 我们需要将它的每一种情况都加入进去. 还是上面的例子, 在下标为 10001 的 map
中加入 ac
, 下标为 01101 的 map
中加入 ?bc
等等.