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. 只有一种字符:直接输出
  2. 大于等于两种字符:
    1. 存在出现次数为 1 1 1 的字符,找到符合条件且字典序最小的字符,将其放在开头,剩下的字符排序
    2. 所有字符出现次数均大于等于 2 2 2
      1. 参照第二个样例,设字典序最小的元素为 a a a,发现当 c n t [ a ] − 2 ≤ n − c n t [ a ] cnt[a]-2\\le n-cnt[a] cnt[a]2ncnt[a] 时,可以构造出形如 a a x a x a x a x a x x x aaxaxaxaxaxxx aaxaxaxaxaxxx 的序列,其中 x x x 为其他字符,意思就是将剩下的字符排序后依次填入 x x x 所代表的的位置
      2. c n t [ a ] − 2 > n − c n t [ a ] cnt[a]-2> n-cnt[a] cnt[a]2>ncnt[a] 时,如果还是按照上面的情况构造,会发现结尾位置会有超过两个的 a a a,也就使得 f ( n ) = 2 f(n)=2 f(n)=2 ,与最初的结论不符,所以这样构造是不合适的:
        1. 如果只有两种字符,记为 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 形式的答案
        2. 如果可用的字符大于等于三种,那么我们仍然先在开头放置 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(思维+构造)的主要内容,如果未能解决你的问题,请参考以下文章

Minima黑色响应式后台管理模板

P3507 [POI2010]GRA-The Minima Game

洛谷 P3507 [POI2010]GRA-The Minima Game

AtCoder ABC 127F Absolute Minima

BZOJ 2091: [Poi2010]The Minima Game

[bzoj2091] [Poi2010]The Minima Game