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\)。
记搜比较好写,我写的记搜。