公式
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\) のままになり正しく答えられます。
アルゴリズム
max_streak = 0(これまでの最大連続勝利数)current = 0(現在の連続勝利数)- 文字列 \(S\) を左から順に見る
- もし文字が
Wなら、currentを1増やす
- もし文字が
Lなら、currentを0にする
max_streakをmax(max_streak, current)で更新
- もし文字が
- 最後に
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 によって生成されました。