码迷,mamicode.com
首页 > 其他好文 > 详细

[AGC024F]Simple Subsequence Problem

时间:2020-02-21 12:53:37      阅读:70      评论:0      收藏:0      [点我收藏+]

标签:imp   mis   task   计算   多少   字符   href   eps   答案   

题目链接

题意

考虑全体不超过 $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$, $f\big(sc, \mathrm{trans}(t, c)\big) \overset+\gets f(s, t)$.

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

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

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

代码链接

[AGC024F]Simple Subsequence Problem

标签:imp   mis   task   计算   多少   字符   href   eps   答案   

原文地址:https://www.cnblogs.com/nealchen/p/12340844.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!