公式

A - 連続勝利の記録 / Record of Consecutive Wins 解説 by admin 印刷ページ

gpt-5.3-codex

概要

文字列 \(S\) を左から1回だけ見て、W が何文字連続しているかを数え続ければ、最長連続勝利数を求められます。
L が出たら連続は途切れるので、カウントを \(0\) に戻すのがポイントです。

考察

この問題は「W の連続区間の最大長」を求める問題です。
重要なのは、各位置で必要なのは「今の連続長」と「これまでの最大値」だけという点です。

例えば S = "WWLWWWLW" を考えると、

  • W → 連続 \(1\)(最大 \(1\))
  • W → 連続 \(2\)(最大 \(2\))
  • L → 連続 \(0\) にリセット
  • W → 連続 \(1\)
  • W → 連続 \(2\)
  • W → 連続 \(3\)(最大 \(3\))
  • L → 連続 \(0\)
  • W → 連続 \(1\)

最終的に最大は \(3\) です。


素朴に「すべての区間を調べる」ような方法だと、区間数が多くなりすぎて非効率です(最悪で \(O(N^2)\) 以上)。
制約は \(N \le 10^6\) なので、1文字ずつの1回走査(\(O(N)\))で解く必要があります。

この問題は、次のルールで十分です:

  • 文字が W なら current += 1
  • 文字が L なら current = 0
  • 毎回 max_streak = max(max_streak, current) を更新

これで W が1つもない場合も、max_streak は初期値 \(0\) のままになり正しく答えられます。

アルゴリズム

  1. max_streak = 0(これまでの最大連続勝利数)
  2. current = 0(現在の連続勝利数)
  3. 文字列 \(S\) を左から順に見る
    • もし文字が W なら、current を1増やす
    • もし文字が L なら、current を0にする
    • max_streak を max(max_streak, current) で更新
  4. 最後に max_streak を出力

計算量

  • 時間計算量: \(O(N)\)
  • 空間計算量: \(O(1)\)(入力文字列を除く)

実装のポイント

  • L を見たときに current = 0 にするのを忘れないこと。

  • max_streak の更新は W のときだけでも正しく動きます(提示コードもその形)。

  • 入力が大きいので、Pythonでは sys.stdin.readline を使うと安定して高速です。

    ソースコード

import sys

def main():
    input = sys.stdin.readline
    n = int(input().strip())
    s = input().strip()

    max_streak = 0
    current = 0

    for ch in s:
        if ch == 'W':
            current += 1
            if current > max_streak:
                max_streak = current
        else:
            current = 0

    print(max_streak)

if __name__ == "__main__":
    main()

この解説は gpt-5.3-codex によって生成されました。

投稿日時:
最終更新: