C
给定一个字符串,求第k大子串。(相同子串算一个)。
后缀数组的做法比较简单:先求出sa,然后从最小的后缀开始枚举。
一个性质:最小的后缀的每一个前缀是最小的那几个。(我竟然没有发现)
然后乱搞一下,去掉相邻两个后缀的lcp(因为重复)。
E
给你一个黑球、白球的序列,球有编号,求最小的操作次数(交换相邻两球),使得黑球升序并且白球升序。
考虑dp,如果我们知道了最后的序列,我们很容易求出操作次数(类似逆序对)。
问题变成了,现在我们要安排一个最终的顺序,使得操作次数最小。
用
表示放了前i个白球,前j个黑球,最小的操作次数。
那么
(最后一个放黑球还是白球)
表示已经放了i个白球,j个黑球,再放一个白球所需要的操作次数。同理,定义了
。
这个题最妙的是第一步转化:把操作倒过来。这样我们就知道了最后的序列是什么,计算答案比较方便。