1 条题解

  • 5
    @ 2026-10-9 15:38:07

    Trie

    题意:给定 nn 个 01? 串,串中仅含 0、1、?,将 ? 替换成 0、1 中的一个。计算此时的 Trie 树的点数之和。题目已经令 KK 表示 ? 个数了。

    观察到 nn 小,有人云:

    状压DP、暴力搜索、指数容斥。

    显然,我们考虑 DP,旁边的容斥。

    不难发现,当确定了字符串时,Trie 树的节点个数是本质不同前缀个数 + 1。

    于是,我们枚举前缀,计算他在这 nn 个字符串中出现的情况数。这是如果我们枚举了一个下标集合 II,有贡献 (−1)∣I∣+1×f(I)(-1)^{|I|+1} \times f(I),f(I)f(I) 表示这个前缀能否出现在我们枚举的下标集合对应的字符串,如果能,那么考虑全局的方案数

    然而,这非常 LZ,考虑优化,由于每个前缀的权值都是 11,故可以枚举集合与前缀长度,判断这个集合有多少个可能均能够出现相同的前缀。注意这是迁全局的,要考虑不在下标集的字符串的贡献。

    在已知字符串下标集合的条件下,我们枚举前缀。前缀的长度不超过集合中任何字符串的长度。

    令 outout 表示集合外的 ? 个数,cntcnt 是比枚举到的前缀小(不严格)的前缀,全是 ? 的个数。

    设前缀长度为 jj,原串是 cc。

    有以下情况:

    • ∀i∈I,ci,j=?\forall i \in I, c_{i, j} = ? ,此时有贡献 2out+bck+cnt2^{out + bck + cnt}。加贡献之前 cnt+1→cntcnt+1\to cnt。其中 bckbck 表示 ii 后面列的问号数。

    • ∃i∈I,ci,j=0\exist i \in I, c_{i, j} = 0 且 ∃i∈I,ci,j=1\exist i \in I, c_{i, j} = 1,不做贡献并马上退出。

    • 否则,2bck+out+cnt2^{bck + out + cnt}。

    如果用 Gray-code 的枚举方法,复杂度正确 O(∣S∣2n)\mathcal{O}(|S|2^n)。

    但是 O(∣S∣×2n×n)\mathcal{O}(|S|\times 2^n \times n),可以过本题。事实上,通过全部问号的数据可以 HACK 之。

    • @ 2026-10-9 15:46:29

      这题难度是否定的有些偏低

    • @ 2026-10-9 17:37:54

      @ YES

    • @ 2026-10-13 9:19:49

      解读:

      于是,我们枚举前缀,计算他在这 nn 个字符串中出现的情况数。这是如果我们枚举了一个下标集合 II,有贡献 (−1)I+1×f(I),f(I)(-1)^{I +1} \times f(I),f(I) 表示这个前缀能否出现在我们枚举的下标集合对应的字符串,如果能,那么考虑全局的方案数。

      f(I)f(I):

      • 如果能出现在我们枚举的下标集合对应的字符串,则为全局的合法方案数。
      • 如果不能出现,则为0。

      这是一个求解“并”的过程,枚举下标集合,也即为枚举长度为 ∣I∣|I| 的组合。求解前缀 ss 作为至少一个字符串的前缀的全局方案数。

  • 1

信息

ID
2794
时间
1000ms
内存
128MiB
难度
8
标签
(无)
递交数
6
已通过
4
上传者