公式
A - 連続勝利の記録 / Record of Consecutive Wins 解説 by admin
gemini-3-flash-thinking概要
この問題は、W(勝ち)と L(負け)で構成された試合記録から、W が連続して出現する最長の部分(連勝記録)の長さを求める問題です。
考察
文字列の中から特定の文字が連続する最大回数を探すという、文字列処理の典型的な問題です。
重要な気づき
「W が連続している部分」に注目すると、それらは必ず L によって区切られていることが分かります。
例えば、S = "WWLWLWWW" という記録がある場合、L を境界として分割すると、"WW", "W", "WWW" という W のみの塊が得られます。
この塊それぞれの長さを計算し、その中で最も大きいものが、求める「最長連続勝利数」となります。
アプローチ
- 文字列を
Lで分割(スプリット)する。 - 分割された各文字列(
Wの連続部分)の長さを測る。 - それらの長さの最大値を求める。
この方法は、文字列を一度走査するだけで済むため、制約の \(N \leq 10^6\) に対しても十分に高速に動作します。
アルゴリズム
Python の便利な文字列操作メソッドを利用します。
- 分割:
s.split('L')を用いて、文字列をLで区切ったリストを作成します。- 例:
"WWLWLWWW".split('L')→['WW', 'W', 'WWW']
- 例:
- 長さの変換:
map(len, ...)を用いて、リスト内の各要素をその長さに変換します。- 例:
['WW', 'W', 'WWW']→[2, 1, 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 によって生成されました。
投稿日時:
最終更新: