Loading

C. 字符序列

简要题意:有一个函数 \(f(c,s)=cs_1cs_2cs_3\cdots cs_nc\)。给出操作序列 \(c_i\),每次操作使 \(s=f(c_i,s)\)\(s\) 开始为空串),求最后的字符串中有多少个本质不同的子序列。

数据范围: \(n\le 500\)

首先我们可以考虑一个简化经典问题,已知一个字符串,求本质不同的子序列数量。

因为我们需要把所有本质不同的子序列在字符串中找到唯一的映射,所以我们贪心的钦定每个字符都取字符串中第一个出现的,而不取第二次出现的。

可设 \(f_{i,j}\) 表示考虑完了 \(i\cdots n\) 的字符,开头为 \(j\) 的本质不同子序列数量。

\(f_{i,j}=\begin{cases}f_{i+1,j}&a_i\ne j\\\sum\limits_c f_{i+1,c}+1&a_i=j\end{cases}\)

假如已知这个字符串,\(O(N\left\vert \sum\right\vert)\) 转移即可。放在这题中可以得到 50pts。

考虑正解,显然字符串非常大,无法求出,我们观察每次操作的字符串之间有什么规律。

a
bab
cbcacbc
dcdbdcdadcdbdcd

我们容易发现,若设 \(T_i\)\(i\)\(n\) 操作后的序列,那么字符串的变化可以写成 \(T_i=T_{i+1}+c_i+T_{i+1}\)。最终字符串即为 \(T_1\)

回到 \(dp\),转移方程为求和的形式,只由 \(i+1\) 转移过来,容易写成矩阵转移的形式,虽然在已知字符串的情况下复杂度为 \(O(N\left\vert \sum\right\vert^3)\),但是它不需要顺推,在对于有规律的字符串变化中可以直接矩阵转移。

复杂度为 \(O(n\left\vert \sum\right\vert^3)\)

posted @ 2024-07-20 20:38  Fire_Raku  阅读(3)  评论(0编辑  收藏  举报