题目
给一个长度为$N$的字符串$S$,求不是$S$的子序列的最短的字符串,有多个的话,输出字典序最小的。
数据范围
$1\leq N \leq 2\times 10^5$
做法
先考虑求最短的“不是S串的子序列”的串的长度,再求其字典序最小的串。
考虑不是S的子序列的串T所具有的性质。
- 如果$T_0$不在S中出现,那么T只要包括$T_0$一个字符就行了。
- 如果$T_0$在S中出现,设$T_0$在S中最先出现的位置为i,那么T不是S的子序列当且仅当$SuffT_1$不是$SuffS_i$的子序列。
考虑DP。
$dp[i]:=$不是$SuffS_i$的子序列的最短长度。
转移的过程就是对每个S的后缀,枚举以$a,b,c,\cdots,z$开头的不是此后缀的字串的最短的字符串。
$dp[i]=min_c{dp[next(i,c)]} + 1$
其中,$next(i,c):=$i后面最近的c出现的位置。
字典序最小可以通过记录每次DP的决策来记录。比如,第一个字母就是在求整个子串的最短的答案时的DP决策。
代码
|
|