B

题目大意及模型转换

一个长度为N的字符串,对每个位置放’a’~’z’中的一个字符,在第i个位置放第j个小写字符需要w[i,j]的代价。求一个符合条件的字符串使其价值最大。需要符合条件为使生成字符串的后缀数组为数组A。N<=10^5。

DP

我们可以考虑一个水DP,设f[i,j]表示做到排名为i的后缀(即后缀sa[i]),在这个后缀的第一个位置放第j个小写字符能获得的最大价值。那么显然可由f[i-1,k]推出。其中 k<j 的时候一定行,那 k=j 呢?
不难发现, k=j 的情况下,由于后缀sa[i]大于后缀sa[i-1],因此按照字符串比较规则,第一个相同,会比较后面。比较后面也符合字符串比较规则,而后面的字符串分别是后缀sa[i-1]+1和后缀sa[i]+1。他们的大小我们很容易能够比较出来。因为我们可以根据sa数组推出rank数组。
这样,这题玩么解决。

注意

这个DP直接做肯定超时。
容易想到线段树优化。
但实际上用一个前缀数组即可优化。

你可能感兴趣的:(B)