CodeForces - 1530E Minimax(思维+构造)
Posted Frozen_Guardian
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CodeForces - 1530E Minimax(思维+构造)相关的知识,希望对你有一定的参考价值。
题目链接:点击查看
题目大意:规定 f ( i ) f(i) f(i) 为 K M P KMP KMP 算法中的 n e x t next next 数组,现在给出一个字符串 s s s,需要将 s s s 重新排列,使得在 max i = 1 n { f ( i ) } \\max\\limits_{i=1}^{n}\\{f(i)\\} i=1maxn{f(i)} 尽量小的前提下,字典序最小
题目分析:多写几组样例不难发现,除了所有字符都相同的情况下,都是可以构造出答案等于 1 1 1 的序列的,现在问题就是如何让字典序尽量小
分类讨论一下:
- 只有一种字符:直接输出
- 大于等于两种字符:
- 存在出现次数为 1 1 1 的字符,找到符合条件且字典序最小的字符,将其放在开头,剩下的字符排序
- 所有字符出现次数均大于等于
2
2
2:
- 参照第二个样例,设字典序最小的元素为 a a a,发现当 c n t [ a ] − 2 ≤ n − c n t [ a ] cnt[a]-2\\le n-cnt[a] cnt[a]−2≤n−cnt[a] 时,可以构造出形如 a a x a x a x a x a x x x aaxaxaxaxaxxx aaxaxaxaxaxxx 的序列,其中 x x x 为其他字符,意思就是将剩下的字符排序后依次填入 x x x 所代表的的位置
- 当
c
n
t
[
a
]
−
2
>
n
−
c
n
t
[
a
]
cnt[a]-2> n-cnt[a]
cnt[a]−2>n−cnt[a] 时,如果还是按照上面的情况构造,会发现结尾位置会有超过两个的
a
a
a,也就使得
f
(
n
)
=
2
f(n)=2
f(n)=2 ,与最初的结论不符,所以这样构造是不合适的:
- 如果只有两种字符,记为 a a a 和 b b b 。考虑第一个位置放 a a a,第二个位置只能放 b b b,那么后续只要出现 a b ab ab 的子串就会使得 f ( i ) > 1 f(i)>1 f(i)>1,所以我们只能将 b b b 一口气都用完,构造出形如 a b b b a a a abbbaaa abbbaaa 形式的答案
- 如果可用的字符大于等于三种,那么我们仍然先在开头放置 a b ab ab,我们的目标是让后面不再出现 a b ab ab 即可,只需要接下来将 a a a 都用掉,既能保证字典序最小,又能保证再也不会出现 a b ab ab,所以可以构造出形如 a b a a a a a c x x x x x x abaaaaacxxxxxx abaaaaacxxxxxx 的答案,其中 c c c 是第三个可用字符,且字典序最小, x x x 是占位符,后面的字符都不会影响答案的正确性了,直接排序就好了
代码就不放了,写的很丑,这个题构造的思路真的很强,故写题解记录一下。我自己的话思考到了分支 2-2-1 后就觉得此后只能构造 f ( i ) > 1 f(i)>1 f(i)>1 的答案了,看了题解之后感觉豁然开朗
以上是关于CodeForces - 1530E Minimax(思维+构造)的主要内容,如果未能解决你的问题,请参考以下文章
P3507 [POI2010]GRA-The Minima Game
洛谷 P3507 [POI2010]GRA-The Minima Game
AtCoder ABC 127F Absolute Minima