Official

B - 元気な応援メッセージ / Cheerful Support Message Editorial by admin

GPT 5.2 High

概要

各メッセージに含まれる感嘆符 ! の個数を数え、\(K\) 個以上なら「元気な応援メッセージ」としてカウントし、その総数を求める問題です。

考察

この問題でやることはシンプルで、各文字列 \(S_i\) について ! が何回出現するか を調べれば十分です。

例えば \(K=3\) のとき、 - "Go!!"! が 2 個なので元気ではない - "Nice!!!"! が 3 個なので元気

という判定になります。

素朴に「全メッセージを一度に結合して数える」などの工夫は不要ですし、むしろ 各メッセージごとに判定 しないと「どのメッセージが条件を満たしたか」が分からず誤り(WA)になります。
また、\(N \le 10^4\)、各 \(|S_i| \le 10^3\) なので、全体で最大 \(10^7\) 文字程度です。各文字を1回ずつ見る程度なら十分間に合います(TLEになりにくい)。

アルゴリズム

  1. 入力で \(N, K\) を受け取る
  2. 答え ans = 0 を用意する
  3. \(i=1\) から \(N\) まで繰り返す:
    • 文字列 \(S_i\) を読む
    • S_i に含まれる ! の個数を数える(Pythonでは S_i.count('!')
    • 個数が \(K\) 以上なら ans を 1 増やす
  4. ans を出力する

計算量

  • 時間計算量: \(O\left(\sum_{i=1}^{N} |S_i|\right)\)
    (各メッセージについて count が文字列全体を走査するため)
  • 空間計算量: \(O(1)\)
    (入力文字列を1つずつ処理し、追加で大きな配列などを持たないため)

実装のポイント

  • 入力が最大 \(10^4\) 行あるので、sys.stdin.readline を使うと高速で安心です。

  • rstrip('\n') で末尾の改行だけを落としてから数えると、意図しない文字が混ざりません(ただし今回の条件では改行は count('!') に影響しないため、より安全のための処理です)。

  • s.count('!') を使うと短くミスなく実装できます。

    ソースコード

import sys

def main():
    input = sys.stdin.readline
    N, K = map(int, input().split())
    ans = 0
    for _ in range(N):
        s = input().rstrip('\n')
        if s.count('!') >= K:
            ans += 1
    print(ans)

if __name__ == "__main__":
    main()

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

posted:
last update: