AT_abc009_3.[ABC009C] 辞書式順序ふたたび
提高+/省选-
通过率:0%
AC君温馨提醒
该题目为【atcoder】题库的题目,您提交的代码将被提交至atcoder进行远程评测,并由ACGO抓取测评结果后进行展示。由于远程测评的测评机由其他平台提供,我们无法保证该服务的稳定性,若提交后无反应,请等待一段时间后再进行重试。
题目描述
你知道字符串的字典序比较吗?如果不知道,可以阅读 ABC007 的 B 问题 中的定义。
这次,你需要解决一个与字典序有关的问题。
首先,给定一个仅由小写英文字母(a-z)组成的长度为 N 的字符串 S。请你在将 S=S1,S2,...,SN 的字符重新排列后,构造出一个字符串 T=T1,T2,...,TN,使得 T 在所有可以通过重新排列 S 得到的字符串中,字典序最小。
不过,排列方式有一个限制。给定一个整数 K,要求原本位置发生变化的字符个数不能超过 K。也就是说,满足 Si=Ti 的 i(1≤i≤N)的个数不能超过 K。
注意:本题比通常的 ABC C 题更难。你可以点击下方按钮查看解题思路提示,建议你认真思考后再查看。
::::info[显示提示]
在追求字典序最小时,让字符串的前面尽可能出现较小的字母是有利的。因此,首先考虑能否将 T 的第一个字符设为尽可能小的字母。
依次尝试将 S 中较小的字母放在 T 的开头,找到第一个可行的字母后,将其作为 T 的第一个字符。接着,在剩下的字符中,依次尝试将较小的字母放在 T 的第二个字符位置,第三个、第四个字符同理确定(在样例 2 的解释中有更具体的说明)。
在尝试时,需要判断“能否让 T 以某个字符串 t 开头”。具体来说,就是判断能否用 S 中还未使用的字符,通过合理排列,使得与 S 后面部分的字符不一致的个数尽量少,并且总的不一致个数不超过 K。
例如,$S = ‘program‘,K = 3$,现在想判断 T 的前 3 个字符能否为 aro。此时,aro 与 S 的前 3 个字符 pro 有 1 个不一致,因此剩下部分的不一致个数必须不超过 2。也就是说,需要将还未用过的字符 pgrm 重新排列,使得与 S 的后半部分 gram 的不一致个数尽量少,并且不超过 2,如果可以做到,则可行。
具体实现该方法以及判定部分的编程细节,请自行思考。
::::
输入格式
输入按以下格式从标准输入读入。
N K
S
- 第 1 行包含两个整数 N(字符串长度,1≤N≤100)和 K(允许改变位置的字符数上限,0≤K≤N)。
- 第 2 行包含一个仅由小写英文字母组成的长度为 N 的字符串 S。
输出格式
请输出通过重新排列 S 得到的、且原本位置发生变化的字符个数不超过 K 的所有字符串中,字典序最小的字符串 T。输出后需换行。
输入输出样例
输入#1
3 2 abc
输出#1
abc
输入#2
7 2 atcoder
输出#2
actoder
输入#3
7 7 atcoder
输出#3
acdeort
输入#4
10 3 helloworld
输出#4
dehloworll
说明/提示
样例解释 1
由于允许改变位置的字符数最多为 2,所以完全不进行排列也是可以的。在本例中,不进行任何排列得到的字符串就是字典序最小的。
样例解释 2
- 首先,考虑能否将 T 的第一个字符设为
a(原字符串atcoder中最小的字母)。 - 这次 S 的第一个字符本身就是
a,因此可以将 T 的第一个字符设为a。(例如完全不排列,S=T,此时 T 的第一个字符就是a) - 因此,T 的第 1 个字符确定为
a。 - 接着,考虑能否将第 2 个字符设为
c。 - 若 T 的前两个字符为
ac,此时至少c的位置发生了变化。 - 因此,需要判断能否用还未使用的字母
deort重新排列,使得与 S 的第 3 个字符及之后的coder匹配时,位置变化的字符数不超过 1。 - 这次可以将
deort排列为toder,得到 $T = $actoder,此时位置变化的字符数为 2。 - 因此,第 2 个字符确定为
c。 - 接着,考虑能否将第 3 个字符设为
d。 - 若 T 的前 3 个字符为
acd,此时c和d的位置都发生了变化。 - 因此,T 的第 4 个及之后的字符不能再有位置变化。
- 但无论如何排列剩下的
eort,都无法与 S 的oder完全一致。 - 因此,第 3 个字符不能为
d。 - 依次尝试
e、o等,最终可以确定答案为actoder。
样例解释 3
由于 K=7,可以任意排列。此时,将所有字母按字母顺序排列即可得到字典序最小的字符串。
由 ChatGPT 4.1 翻译
输入解题思路,AI测评打分。不知道怎么写?