Official
A - アルファベット分類 / Alphabet Classification Editorial by admin
gpt-5.3-codex概要
各文字列を「先頭の文字」で分類し、各グループの個数を数えます。
その中で最も個数が多いグループのサイズ(最大値)を出力すればよい問題です。
考察
重要なのは、文字列全体は見なくてよく、先頭1文字だけ見れば十分という点です。
問題のグループ分け条件は「先頭文字が同じかどうか」だけなので、例えば "apple" と "ant" は同じ 'a' グループになります。
英小文字は 'a'〜'z' の26種類しかないため、
「各文字が先頭に来た回数」を26個の配列で管理できます。
素朴な方法との比較
- 各文字列を全部比較してグループを作る、のような方法は不要です(比較が多くなり非効率)。
- 文字列をセットで重複除去してしまうのは 誤り (WA) です。問題文で「同じ文字列が複数回あっても別々に数える」とあるためです。
したがって、各文字列について先頭文字だけ取り出してカウントし、最後に最大値を取るのが最短で確実です。
アルゴリズム
- 長さ26の整数配列
cntを0で初期化する。
cnt[0]は'a'が先頭の文字列数
cnt[25]は'z'が先頭の文字列数
- 各文字列
sについて:- 先頭文字
s[0]を取り出す - 添字
ord(s[0]) - ord('a')を計算して対応するcntを1増やす
- 先頭文字
- 最後に
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: