Official

A - アルファベット分類 / Alphabet Classification Editorial by admin

gpt-5.3-codex

概要

各文字列を「先頭の文字」で分類し、各グループの個数を数えます。
その中で最も個数が多いグループのサイズ(最大値)を出力すればよい問題です。

考察

重要なのは、文字列全体は見なくてよく、先頭1文字だけ見れば十分という点です。
問題のグループ分け条件は「先頭文字が同じかどうか」だけなので、例えば "apple" と "ant" は同じ 'a' グループになります。

英小文字は 'a'〜'z' の26種類しかないため、
「各文字が先頭に来た回数」を26個の配列で管理できます。

素朴な方法との比較

  • 各文字列を全部比較してグループを作る、のような方法は不要です(比較が多くなり非効率)。
  • 文字列をセットで重複除去してしまうのは 誤り (WA) です。問題文で「同じ文字列が複数回あっても別々に数える」とあるためです。

したがって、各文字列について先頭文字だけ取り出してカウントし、最後に最大値を取るのが最短で確実です。

アルゴリズム

  1. 長さ26の整数配列 cnt を0で初期化する。
    • cnt[0] は 'a' が先頭の文字列数
    • cnt[25] は 'z' が先頭の文字列数
  2. 各文字列 s について:
    • 先頭文字 s[0] を取り出す
    • 添字 ord(s[0]) - ord('a') を計算して対応する cnt を1増やす
  3. 最後に max(cnt) を出力する

例えば入力が
apple, art, banana, box, cat
ならカウントは a:2, b:2, c:1 となり、答えは 2 です。

計算量

  • 時間計算量: \(O(N)\)
    (各文字列に対して先頭文字の処理を1回ずつ行うだけ)
  • 空間計算量: \(O(1)\)
    (26要素の配列のみ。入力サイズに依存しない定数)

実装のポイント

  • S_i の長さは1以上なので、s[0] は必ず安全に参照できます。

  • 文字列全体を処理する必要はなく、s[0] だけで十分です。

  • 高速入力のため sys.stdin.readline を使う実装は、\(N \le 10^5\) でも安心です。

    ソースコード

import sys

def main():
    input = sys.stdin.readline
    n = int(input().strip())
    cnt = [0] * 26

    for _ in range(n):
        s = input().strip()
        cnt[ord(s[0]) - ord('a')] += 1

    print(max(cnt))

if __name__ == "__main__":
    main()

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

posted:
last update: