AtCoder Regular Contest 097

C

给定一个字符串,求第k大子串。(相同子串算一个)。

后缀数组的做法比较简单:先求出sa,然后从最小的后缀开始枚举。
一个性质:最小的后缀的每一个前缀是最小的那几个。(我竟然没有发现)
然后乱搞一下,去掉相邻两个后缀的lcp(因为重复)。

E

给你一个黑球、白球的序列,球有编号,求最小的操作次数(交换相邻两球),使得黑球升序并且白球升序。

考虑dp,如果我们知道了最后的序列,我们很容易求出操作次数(类似逆序对)。
问题变成了,现在我们要安排一个最终的顺序,使得操作次数最小。
d p i . j 表示放了前i个白球,前j个黑球,最小的操作次数。
那么 d p i , j = m i n ( d p i , j 1 + c o s t b i , j 1 , d p i 1 , j + c o s t w i 1 , j )
(最后一个放黑球还是白球)
c o s t w i , j 表示已经放了i个白球,j个黑球,再放一个白球所需要的操作次数。同理,定义了 c o s t b i , j

这个题最妙的是第一步转化:把操作倒过来。这样我们就知道了最后的序列是什么,计算答案比较方便。

猜你喜欢

转载自blog.csdn.net/dt_kang/article/details/80301119