Loading

P7537 [COCI2016-2017#4] Rima

\(\text{solution}\)

非常妙的一道题目。

首先看到要求后缀,就想到后缀数组 Trie 树,我们把所有字符串倒过来,存到 Trie 树里,这个时候,后缀就变成了前缀了。

我们考虑 DP 求解这个东西,我在初次思考时考虑不成熟,样例过弱,建议造一组多叉树的数据。

\(f_i\) 表示以 \(i\) 结尾的子树内的字符串能接成答案的个数。此时我们发现,我们可以让一棵子树内的处理的字符串从大到小排列,然后到了当前的 \(i\) 节点后,我们再把其他儿子都加进来,然后再把 \(i\) 加进来,然后此时将一个儿子内的子树按从小到大的方式加进来。

也就是说,你选的字符串是一个单谷序列,只有这样才是可行的,所以我们可以把 \(f\) 最大的两个儿子提到旁边,然后其他儿子凑个数,再加上 \(i\) 这一个就是答案了。

考虑 \(f\) 怎么求,考虑一定是由某个儿子内的子树从大到小转移过来的,当然也可以加上剩余的子树,也可以构成序列,所以 \(f\) 是:

\[f_i = \max (f_{son}) + sum - 1 \]

\(sum\) 指得是有字符串标记的儿子。

总体感受:本题非常具有思维难度,要静下心来想,是道不错的好题。同时也没有太多复杂的算法,没有太过模板的套路。

posted @ 2023-05-31 11:38  Alexande  阅读(19)  评论(0)    收藏  举报