Loading

AT_utpc2012_07 k番目の文字列 题解

模拟赛搬了这个题,来写个题解。

\(n\) 这么小,不是状压就是很多很多维 DP(暴论)。状压我没想出来,那就正常 DP。

考虑依次填入字符串的每个位置,记 \(f(i,j,num,op)\) 表示填了前 \(i\) 个位置,其中比 \(s_0\) 小的有 \(j\) 个,目前字典序比 \(s\) 小的子串有 \(num\) 个的方案数,\(op\) 表示是否已经把 \(s\) 填入。那转移分三种:

\[f(i,j,num,op) \rightarrow \begin{cases} f(i+1,j+1,num+j+1,op) \\ f(i+1,j,num+j,op) \\ f(i+len_s,j+cnt,num+j*len_s+tot,1) & op=0 \And i+len_s \le n \end{cases} \]

其中 \(cnt\) 表示 \(s\) 内部比 \(s_0\) 小的位置的个数,\(tot\) 表示 \(s\) 内部对 \(num\) 的贡献,这两个量都可以在 \(s\) 串中预处理得到。

应该比较好理解,三种转移分别表示在 \(i+1\) 处填入比 \(s_0\) 小的、比 \(s_0\) 大的、直接填入 \(s\)

记搜比较好写,我写的记搜。

code

posted @ 2024-11-01 22:07  tai_chi  阅读(3)  评论(0编辑  收藏  举报