APCS Jan 2022 - h083
APCS Jan 2022 - h083 Q3 [Python]
本題敘述:
占卜籤筒有
M
支籤,每一支籤為一個由英文小寫字母組成的字串。從籤筒內抽出兩支籤,若將這兩支籤上的字串S
和T
連接起來形成的字串可以將該字串拆成左右兩半並且內容一樣,則抽到聖筊代表神明同意,否則神明不同意或是沒回答。例如抽出的兩支籤上的字串分別為 piep 和 ie,則相連接起來的字串為 piepie 可以拆分左右兩半為相同的字串 pie 和 pie,但抽出的兩支籤為 foo 和 bar 時則不滿足條件。 神奇的是,若抽到的兩支籤
S
和T
為聖筊,則不管是將T
接在S
後面或是順序反過來接起來,都可以是聖筊,再次說明了這兩支籤有著某種神秘力量在祝福著抽到的幸運人。例如 piep 和 ie 不管是使用 piepie 或是 iepiep 都可以拆分成兩個一樣的字串。詢問籤筒內這
M
支籤,有幾個 pair 可以形成聖筊。相同的兩支籤組合計算一次即可。
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)
解題報告:
- 這段代碼使用for迴圈集合中的每個字串
i
,並檢查其兩端是否相同(通過索引idx
來檢查)。 - 如果兩端相同,並且去掉兩端相同部分之後的中間部分也在集合
c
中,那麼這是一個有效的字串對。 - 每找到一個這樣的對,就將
total
加1。最後,輸出total
的值,即符合條件的字串對數量。
本題重點:
-
字串分割:
- 假設輸入
abyyyab
,我們需要檢查這個字串的兩端部分是否相同。這可以通過for迴圈字串的一半來完成,檢查每一部分的開頭和結尾是否相同:if i[:idx] == i[-idx:]
。
- 假設輸入
-
使用set()搜尋:
- 使用Python內建的
set()
來儲存所有的字串。接下來,我們檢查去掉兩端相同部分之後的中間部分是否存在於這個集合中:if i[idx:-idx] in c
。這樣可以確保中間部分也是籤筒中的某個字串。
- 使用Python內建的
本題知識:
- 枚舉
- HASH
- SET
- [✔️] 程式碼如果需要可以直接使用。
- [✔️] 分享貼文請標註來源。