APCS Jan 2022 - h083 Q3 [Python]
問題文:
おみくじの筒に M 本のくじがあり、それぞれに英小文字の文字列が書かれています。2本を取り出して文字列 S と T を連結したとき、前半と後半が同じ文字列になれば、神意が「可」を示す聖筊とします。それ以外は「否」または回答なしです。例えば piep と ie は piepie となり、pie と pie に分けられますが、foo と bar は条件を満たしません。不思議なことに、S と T が条件を満たすなら逆順でも成立します。piepie と iepiep は、どちらも同じ文字列2つに分けられます。M 本から作れる組のうち、条件を満たす組の数を求めてください。同じ2本の組み合わせは一度だけ数えます。
m = int(input())
c = set()
for _ in range(m):
c.add(input())
total = 0
for i in c:
for idx in range((len(i) - 1 )//2):
idx += 1
if i[:idx] == i[-idx:] and i[idx:-idx] in c:
total += 1
print(total)
解法レポート
- 集合内の各文字列
iをループし、インデックスidxを使って両端が一致するか調べます。 - 両端が一致し、それを取り除いた中央部分も集合
cに存在すれば、有効な組です。 - 見つかるたびに
totalを1増やし、最後に条件を満たす組の数として出力します。
ポイント
- 文字列のスライス:
abyyyabなら、文字列の半分までループして先頭と末尾を比較します:if i[:idx] == i[-idx:]。 set()による検索: Python組み込みのset()に全文字列を格納します。if i[idx:-idx] in cによって中央部分も筒の中にある文字列か確認します。
この問題で使う知識:
- 全探索
- HASH
- SET
- [✔️] 必要であればコードをそのまま使用できます。
- [✔️] 共有する際は出典を明記してください。

この記事は繁体字中国語の原文をAIで翻訳したものです。意味や表現に違いがある可能性があります。正確な内容は繁体字中国語の原文をご確認ください。