12 lines
ヒント1(白文字)
まずはソート
ヒント2
ab→d、dc→
という処理は、abcを消去する処理と同等
ヒント3
ヒント2の処理が終わり切った場合、残っている文字の組み合わせは
aとd、aとc、bとd、bとc
の4パターン
8 lines
ヒント1
12linesとは全く別の考え方をする
ヒント2(割と核心)
・文字aが含まれていればaを1文字消す
・文字bが含まれていればbを1文字消す
・文字cが含まれていればcを1文字消す
・文字aが含まれていればaを1文字消す
・文字bが含まれていればbを1文字消す
・…
と処理を繰り返していき、1文字になったときの文字が最頻値である
(対象の文字がなければ何もしない)
ヒント3
残り1文字であることを判定するのは行数がかさむので、全ての文字を消去したときのヒント1の処理の実行回数を考える
(何もしなかった場合もカウントする)
この回数を3で割った余りが各最頻値に対応している
ヒント4
ヒント1と実行回数が等しいが、消す文字の種類が変化しない処理を考える
ヒント5(核心)
・文字aが含まれていればaを消し、残りの文字をc→b→a→cと巡回させる
という処理を繰り返したときの実行回数はヒント1と等しい
ヒント6
ヒント4の処理を繰り返して全てのアルファベットが消去されたときに、$が(実行回数と3を法として合同な数)個あるコードを考える
ヒント7
ヒント4の処理1回毎に、$を1文字または4文字追加する
ヒント8(具体的なコード)
$$$$a:$
$c:b$
$b:a$
$a:c$
:$$$$
というコードは
・文字列の各文字は、1回の処理で1回or4回巡回する
・文字列の最も左にあるaで4個の$が必ず溜まり消去される(それより左側のc,b,aについては移動ルールが適用されるため)
・1回の処理で追加される$の個数は1個or4個
という特徴を持つ
ヒント9
・全ての文字が消去されたならば先頭に「何か」を追加する
という条件分岐を加えると、$の個数を3の倍数個ずつ増やすことができる
後は、一定量の$になったところで終了処理を書いてあげればよい
最も単純に考えると条件分岐に2行、終了処理に3行必要だが、それぞれ1行、2行で書ける