公式

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)\) で済みます。

アルゴリズム

  1. 変数 count(現在の連続 W の長さ)と max_count(これまでの最大値)を \(0\) で初期化する。
  2. 文字列 S を先頭から1文字ずつ見ていく:
    • 文字が W なら count\(1\) 増やし、max_count を更新する。
    • 文字が L なら count\(0\) にリセットする。
  3. 最後に 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 によって生成されました。

投稿日時:
最終更新: