1 条题解
-
0
这题要分成两个问题
- 可以删出来哪些字符串。
- 哪一种字符串最小。
每次删除的字符串一定从某个点开始是连续的一段。并且如果我们能删除,那么就可以删除
先来看问题1
设 表示之前有个c的情况下,是否能删
可以优化一下
设
当然dp是过不去的,得用其他的方法。
用一个栈,倒序枚举,如果号点 ,那么.
否则
让我们来证明这个算法。假设对于某些 是错的。考虑这些中最右边的一个。我们决定该段在处结束(),,但实际上该段应该在处结束()。考虑一下把删除关系建出来的树。不能是的直系子女。让我们从往上走,直到到达的孩子,让它成为。根据假设,对于,我们可以找到, 一定会被删掉。所以当我们考虑时, 不可能出现在栈中。矛盾。
考虑问题2。
表示 中最小的字典序字符串。那么
如果记next而不是字符串。
$ans[i]=s[i]+s[\operatorname{next}[i]]+s[\operatorname{next}[\operatorname{next}[i]]+\ldots$
利用hash+倍增跳比较字符串,可以优化到
如果我们建树去做。
$$\huge ans_i=s_i+\min^{dp'[s[i]][i+1]}_{j=i+1} ans_j $$单次询问 ,总时间复杂度
实现提示:倒序枚举,用倍增记录区间最小字符串 ,每次求出 ,更新倍增数组。用hash和倍增判字典序大小。
最后做法
让我们结合第一和第二部分的算法。当我们考虑,并从栈中删除时,使。这样的算法将进行次比较,比较需要。总时限
- 1
信息
- ID
- 3
- 时间
- 1000ms
- 内存
- 1024MiB
- 难度
- 9
- 标签
- 递交数
- 97
- 已通过
- 9
- 上传者