CF176B
- 字符串
- DP
【题意】
给定一个长度为 $n\le 1000$ 的字符串,再给定一个长度相等的目标串和非负整数 $k\le 10^5$,请问是否可以使用正好 $k$ 次操作,将原串变成目标串。
每一次操作选择一个位置 $p\in[1,n)$,然后将字符串变成 $[p+1,n]+[1,p]$。其中 $+$ 表示连接。
求操作方案数,取模。两个方案不同当且仅当至少有一步 $p$ 的选择不同。
【解析】
猜一个非常重要的结论:如果一次操作不行的话,那一定不行。
感性理解一下,字符之间的相对位置大体不变,一次不行的话多次也不行。
推广一下,也就是说做任意多次操作以后只需要做 $1$ 次操作就可以变成想要的样子。
所以我们可以先暴力求出一次操作能满足条件的方案数,记为 $\text{cnt}$。
则考虑 DP,设 $f_i$ 表示第 $i$ 步变成目标串的方案数,$g_i$ 表示第 $i$ 步没变成目标串的方案数。
推出转移方程 $f_i=cnt\times g_{i-1}+(cnt-1)\times f_{i-1}$。表示有 $\text{cnt}$ 种方式从上一个的任意非目标串状态变成目标串状态,$\text{cnt-1}$ 种方式从上一个的目标串再操作一次还是目标串。
类似地,$g_i=(n-cnt)\times f_{i-1}+(n-cnt-1)\times g_{i-1}$。
答案是 $f_k$,初始状态就是看看原串和目标串是否一样,是则 $f_0=1$,否则 $g_0=1$。
|
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 kketchup的小窝!