A - 連続勝利の記録 / Record of Consecutive Wins 解説 by admin
Claude 4.6 Opus (Thinking)概要
文字列中の W が連続して並ぶ最長の長さを求める問題です。いわゆる「最長連続(ランレングス)」を求める典型問題です。
考察
問題の本質
文字列 S の中で、W が途切れずに何回連続するかの最大値を求めます。
例えば S = "WWLWWWLW" の場合、W の連続部分は以下の通りです:
- 先頭の WW → 長さ 2
- 中央の WWW → 長さ 3
- 末尾の W → 長さ 1
よって答えは 3 です。
素朴なアプローチとの比較
二重ループで「各位置から始まる連続 W の長さ」をすべて調べると \(O(N^2)\) かかり、\(N\) が最大 \(10^6\) の制約ではTLE(時間超過)になる可能性があります。
しかし、文字列を 1回走査するだけ で答えを求めることができます。W が来たらカウントを増やし、L が来たらカウントをリセットする、という方法です。これなら \(O(N)\) で済みます。
アルゴリズム
- 変数
count(現在の連続Wの長さ)とmax_count(これまでの最大値)を \(0\) で初期化する。 - 文字列
Sを先頭から1文字ずつ見ていく:- 文字が
Wならcountを \(1\) 増やし、max_countを更新する。 - 文字が
Lならcountを \(0\) にリセットする。
- 文字が
- 最後に
max_countを出力する。
具体例での動作(S = "WWLWWWLW")
| 位置 | 文字 | count |
max_count |
|---|---|---|---|
| 0 | W | 1 | 1 |
| 1 | W | 2 | 2 |
| 2 | L | 0 | 2 |
| 3 | W | 1 | 2 |
| 4 | W | 2 | 2 |
| 5 | W | 3 | 3 |
| 6 | L | 0 | 3 |
| 7 | W | 1 | 3 |
最終的に max_count = 3 が答えとなります。
計算量
- 時間計算量: \(O(N)\) — 文字列を1回走査するだけ
- 空間計算量: \(O(N)\) — 文字列 \(S\) の格納に \(O(N)\)、それ以外の変数は \(O(1)\)
実装のポイント
max_countの更新はWを見つけたタイミング(countを増やした直後)で行います。Lの時にまとめて更新する方法もありますが、文字列の末尾がWで終わる場合に更新漏れ が起きるため、Wのタイミングで更新するのが安全です。Wが一つもない場合はcountが一度も増えないため、max_countは初期値の \(0\) のまま出力されます。これは問題文の仕様通りです。ソースコード
N = int(input())
S = input()
max_count = 0
count = 0
for c in S:
if c == 'W':
count += 1
if count > max_count:
max_count = count
else:
count = 0
print(max_count)
この解説は claude4.6opus-thinking によって生成されました。
投稿日時:
最終更新: