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になりにくい)。
アルゴリズム
- 入力で \(N, K\) を受け取る
- 答え
ans = 0を用意する - \(i=1\) から \(N\) まで繰り返す:
- 文字列 \(S_i\) を読む
S_iに含まれる!の個数を数える(PythonではS_i.count('!'))- 個数が \(K\) 以上なら
ansを 1 増やす
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: