コンテスト時間: 2024-11-16(土) 21:00 ~ 2024-11-16(土) 22:40 (100分)
A - 123233
Difficulty:16
解答時間: 2:10
- 6桁の正整数 が与えられるので、この整数が以下の条件を全て満たすか判定せよ。
- の各桁のうち、 は丁度1つである。
- の各桁のうち、 は丁度2つである。
- の各桁のうち、 は丁度3つである。
- を文字列として受け取り、全走査しながら
1
,2
,3
の個数を数えていけばよい。
B - Hurdle Parsing
Difficulty: 27
解答時間: 2:45
- 長さ の正整数列 から、次のように文字列 を生成した。生成された文字列 が与えられるので、正整数列 を復元せよ。
|
と初期化する。- の順に、 次の操作を行う。
- の末尾に
-
を 個追加する。 - の末尾に
|
を1個追加する。
- の末尾に
- から を見ていき、
|
となるまでカウンターを増やし、それを出力していく。その後、カウンターを初期化する。
C - Move Segment
Difficulty: 223
解答時間: 36:16
0
,1
のみからなる長さ の文字列 が与えられる。 の中で先頭から 番目の1
の塊を、 番目の1
の塊の直後まで移動した文字列を出力せよ。- とりあえず をランレングス圧縮して、
0
と1
の塊が全体の塊の何番目にあるかを2つの配列に持っておく。 1
の塊を出力する際にカウンターを増やしていき、カウンターが のとき 個目の1
の塊を出力する。- 合計3つのインデックス管理をしなければならず実装に時間がかかってしまったが、よく考えると
1
の塊の前後は必ず0
の塊なので、 個目の1
の塊の次は0
と1
の塊をswap
してやればよいことになる。
D - Strange Mirroring
Difficulty: 849
解答時間: 32:21
英文字からなる文字列 が与えられる。 に以下の操作を 回繰り返すとき、全ての操作を終えた後の の先頭から 文字目をそれぞれ求めよ。
- まず、 の大文字を小文字に、小文字を大文字に書き換えた文字列を とする。
- その後、 をこの順に連結した文字列を新たな とする。
各操作ごとの を書き出していくと、以下のようになる。
- これを最後から再帰的にさかのぼっていくことを考えると、以下のような再帰関数
f(文字列 s, インデックス k, 文字列の長さ l)
が構築できる。なお、flip(x)
は文字列 の大文字小文字を反転したものを示す。- のとき(ベースケース)、 を出力する。
- そうでないとき、 として、
- のとき、
f(s, k, l)
を呼び出す。 - そうでないとき、
flip(f(s, k - l, l))
を呼び出す。
- のとき、
- が区切り線の前後どちらにあるかで場合分けするイメージ。
結果
Performance: 995
Rating: 673 → 710 (+37) Highest更新!
緑も見えてきた。