令 $f_{i,0/1}$ 表示以字符串前 $i$ 个字符构成的所有不同子序列中以 $0/1$ 结尾的子序列的个数。
对于当前字符 $s_i=$ 0
$\texttt{or}$ 1
$\texttt{or}$ ?
,有不同的转移方式,以下先说明 $s_i=$ 0
的情况:
- 首先令 $f_{i,0} \leftarrow f_{i-1,0},\ f_{i,1} \leftarrow f_{i-1,1}$。即不考虑 $s_i$ 作为结尾,直接继承上一个集合。
- 考虑由 $s_i$ 结尾的子序列有多少相对于 $f_{i-1,0}$ 的集合是没有出现过的。
- 考虑容斥,先求出结尾接上 $s_i$ 可以成为满足条件的子序列总共有 $f_{i-1,0}+f_{i-1,1}+1$ 个($+1$ 表示空串)。
- 然后考虑接上 $s_i$ 后还是在集合 $f_{i-1,0}$ 中的子序列的个数。
- 由于在 $s_{1\sim (i-1)}$ 中 $0$ 是连续分布的,所以,集合 $f_{i-1,0}$ 中的其他的子序列去掉末尾的 $0$ 再接上位置 $i$ 上的 $0$ 都可以表示为该集合中的元素。
- 因此最终答案为 $f_{i-1,0}+[(f_{i-1,0}+f_{i-1,1}+1)-f_{i-1,0}]=f_{i-1,0}+f_{i-1,1}+1$
- 因此,我们一共可以写出:
- $f_{i,0}\leftarrow f_{i-1,0}+f_{i-1,1}+1$
- $f_{i,1}\leftarrow f_{i-1,1}$
同样,当 $s_i=$ 1
时,
$$f_{i,0}\leftarrow f_{i-1,0}$$
$$f_{i,1}\leftarrow f_{i-1,0}+f_{i-1,1}+1$$
当 $s_i=$ ?
时,
$$f_{i,0}\leftarrow f_{i-1,0}+f_{i-1,1}+1$$
$$f_{i,1}\leftarrow f_{i-1,0}+f_{i-1,1}+1$$
然后去看 Editorial - AtCoder Beginner Contest 246。
Code
1 | /* |