公式

A - 連続勝利の記録 / Record of Consecutive Wins 解説 by admin

gemini-3-flash-thinking

概要

この問題は、W(勝ち)と L(負け)で構成された試合記録から、W が連続して出現する最長の部分(連勝記録)の長さを求める問題です。

考察

文字列の中から特定の文字が連続する最大回数を探すという、文字列処理の典型的な問題です。

重要な気づき

W が連続している部分」に注目すると、それらは必ず L によって区切られていることが分かります。 例えば、S = "WWLWLWWW" という記録がある場合、L を境界として分割すると、"WW", "W", "WWW" という W のみの塊が得られます。

この塊それぞれの長さを計算し、その中で最も大きいものが、求める「最長連続勝利数」となります。

アプローチ

  1. 文字列を L で分割(スプリット)する。
  2. 分割された各文字列(W の連続部分)の長さを測る。
  3. それらの長さの最大値を求める。

この方法は、文字列を一度走査するだけで済むため、制約の \(N \leq 10^6\) に対しても十分に高速に動作します。

アルゴリズム

Python の便利な文字列操作メソッドを利用します。

  1. 分割: s.split('L') を用いて、文字列を L で区切ったリストを作成します。
    • 例: "WWLWLWWW".split('L')['WW', 'W', 'WWW']
  2. 長さの変換: map(len, ...) を用いて、リスト内の各要素をその長さに変換します。
    • 例: ['WW', 'W', 'WWW'][2, 1, 3]
  3. 最大値の取得: max(...) を用いて、得られた長さのリストから最大値を取り出します。
    • 例: max([2, 1, 3])3

計算量

  • 時間計算量: \(O(N)\)
    • 文字列の読み込み、分割、長さの計算、最大値の探索はすべて文字列の長さ \(N\) に対して線形(比例する時間)で行われます。
  • 空間計算量: \(O(N)\)
    • 分割した結果の文字列リストを保持するために、最大で \(N\) に比例するメモリを使用します。

実装のポイント

  • 大量の入力への対応: \(N\)\(10^6\) と大きいため、sys.stdin.read().split() を使って一括で入力を取得することで、実行時間を短縮しています。

  • 空の結果への配慮: split('L') を使った手法は、W が一つも含まれない場合(例:"LLL")でも ['', '', '', ''] のような空文字列のリストを返し、その長さ 0 を正しく最大値として扱えるため、非常に簡潔に記述できます。

    ソースコード

import sys

def main():
    # 入力をすべて取得し、空白(改行を含む)で分割してトークン化します
    # data[0] は試合数 N、data[1] は勝敗の文字列 S に対応します
    data = sys.stdin.read().split()
    
    # 試合の記録 S が存在するか確認します
    if len(data) < 2:
        # 文字列 S が存在しない場合は、連続勝利数は 0 とします
        if len(data) == 1:
            print(0)
        return
    
    # 勝敗を表す文字列 S を取得します
    s = data[1]
    
    # 文字列を 'L'(負け)で分割することで、'W'(勝ち)の連続部分のみを抽出します
    # 各部分の長さを map(len, ...) で計算し、その最大値を max(...) で求めます
    # 'W' が一つも含まれない場合、s.split('L') は空文字列のリストを返し、max は 0 を出力します
    print(max(map(len, s.split('L'))))

if __name__ == '__main__':
    main()

この解説は gemini-3-flash-thinking によって生成されました。

投稿日時:
最終更新: