• [AGC024F]Simple Subsequence Problem


    题目链接

    题意

    考虑全体不超过 $N$ 位的(非空)01串,(为了题解写得方便)其全体集合记为 $U$.

    给定 $U$ 的子集 $S$, 求 $U$ 有多少元素满足它是 $S$ 中至少 $K$ 个串的子序列。

    保证 $N le 20$, $K le |S|$.

    题解

    先考虑如何判定字符串 $s$ 是 $t$ 的子串。

    从左到右依次考虑 $s$ 的每个字符 $s_i$:

    • 若 $t$ 中不含 $s_i$, 可得 $s$ 不是 $t$ 的子串;
    • 否则将 $t$ 中第一个 $s_i$ 及之前的所有字符删去(记此处理后的字符串为 $mathrm{trans}(t, s_i)$),继续枚举 $s_i$.

    当 $s$ 的所有字符都考虑完毕时,可得 $s$ 是 $t$ 的子串。

    考虑用动态规划描述上述过程,将 $U$ 的所有元素和 $S$ 的所有元素一并匹配。

    因此记 $f(s, t)$ 表示 $S$ 中有多少元素按照上述操作依次匹配过 $s$ 中的字符后,余下的字符串为 $t$.

    初值:对于 $t in S$, $f(epsilon, t)=1$, 其余为 $0$.

    转移:对于 $sc in U$(其中 $s$ 是一个01串,$c$ 是一个字符)以及含有 $c$ 的字符串 $t$, $fig(sc, mathrm{trans}(t, c)ig) overset+gets f(s, t)$.

    答案:$$sum_{s in U}left[sum_{t in Ucup{epsilon}}f(s, t) ge K ight]$$

    用二进制来压缩 $s$ 与 $t$ 并计算 $mathrm{trans}(t, c)$.

    由于 $|s|+|t| le N$, 该算法的时空复杂度为 $O(N2^N)$.

    代码链接

  • 相关阅读:
    深入浅出Mybatis系列(一)---Mybatis入门
    深入浅出Mybatis系列(十)---SQL执行流程分析(源码篇)
    深入浅出Mybatis系列(九)---强大的动态SQL
    ZK请求处理
    ZK配置文件
    ZK数据同步
    集群间通信的消息类型
    ZK客户端
    Zookeeper崩溃恢复过程(Leader选举)
    Windows编程
  • 原文地址:https://www.cnblogs.com/nealchen/p/AGC024F.html
Copyright © 2020-2023  润新知