Problem Statement
文字列の辞書式順序による比較についてはご存知だろうか?知らない場合は ABC007 の B 問題にその定義が載っているので読むとよいだろう。
今回は、この辞書式順序が重要な役割を果たす問題を解いてもらいたいと思う。
まず、英小文字(a-z)のみからなる $N$ 文字の文字列 $S$ が与えられる。$S = S_1,\,S_2,\,...,\,S_N$ の文字を並び替えて作れるような文字列 $T = T_1,\,T_2,\,...,\,T_N$ のうち、辞書順で最小になるようなものを求めてほしい。
ただし、並び替え方には $1$ つだけ制限がある。別に整数 $K$ が与えられ、元から位置の変わった文字の個数を $K$ 以下にしなければならない。つまり、$S_i ≠ T_i$ となるような(文字が不一致となるような) $i$ ($1 ≦ i ≦ N$)の個数が $K$ 以下であるような並び替え方しかできない。
※この問題は普段の ABC の C 問題に比べ難しくなっています。下のボタンを押すことで、ヒントとしてこの問題を解くためのアイデアの説明を読むことができます。じっくり取り組んでみてください。
ヒントを表示する
重要な点は、辞書順で最小を目指すときには 文字列の先頭にできるだけ小さいアルファベットがある方がよい ということです。なので、まずは $T$ の $1$ 文字目をできるだけ小さいアルファベットにすることを考えましょう。 $S$ の文字のうち、小さいアルファベットから順に $T$ の先頭にできるかを試していって、最初にできるとわかった文字が $T$ の $1$ 文字目として決まります。次は残った文字のうち小さいものから順に $T$ の $2$ 文字目にできるか試していき、$3$ 文字目、$4$ 文字目と同様に決めていきます(入出力例2 でもう少し具体的な説明をしています)。 試すときに必要なのは「$T$ をある文字列 $t$ で始めることができるか?」を判定することです。これは、$S$ のうちまだ $t$ で使っていない文字をうまく並び替えて、$S$ の後ろのほうとの文字の不一致の数をできるだけ少なくし、全体として不一致の数を $K$ 以下にできるかどうかで判定できます。 たとえば $S =$program、$K = 3$ で、$T$ の最初 $3$ 文字を aro にできるかを判定したいとします。このとき、すでに aro と $S$ の先頭 $3$ 文字 pro で不一致が $1$ つあるので、残りの部分で不一致の数を $2$ 以下にしないといけません。つまり、まだ使っていない文字 pgrm をうまく並び替えて、$S$ の後ろのほうである gram との不一致の数をできるだけ減らして $2$ 以下にできれば OK です。 この方法と、判定の部分を具体的にどうプログラムにするかについては自力で頑張ってみましょう。
Input
入力は以下の形式で標準入力から与えられる。
N K
S
$1$行目には文字列の文字数を表す整数$N$($1 ≦ N ≦ 100$) と、位置を変えてよい文字数の上限を表す整数$K$($0 ≦ K ≦ N$) が与えられる。$2$行目には英小文字のみからなる$N$文字の文字列$S$が与えられる。
Output
$S$ の文字を並び替えて作れるような文字列で、しかも元から位置の変わった文字の個数が $K$ 個以下であるようなもののうち、辞書式順序で最も小さくなるような文字列を $1$ 行に出力せよ。
出力の末尾にも改行をいれること。
样例
3 2
abc
abc
7 2
atcoder
actoder
7 7
atcoder
acdeort
10 3
helloworld
dehloworll
题面与样例版权归 AtCoder 及出题人所有;中文翻译由 AI 生成(CI 管线),如有出入请以原文为准。