回到文章

APCS Jan 2022 - h083


APCS Jan 2022 - h083 Q3 [Python]

本題敘述:

占卜籤筒有M支籤,每一支籤為一個由英文小寫字母組成的字串。從籤筒內抽出兩支籤,若將這兩支籤上的字串ST連接起來形成的字串可以將該字串拆成左右兩半並且內容一樣,則抽到聖筊代表神明同意,否則神明不同意或是沒回答。

例如抽出的兩支籤上的字串分別為 piep 和 ie,則相連接起來的字串為 piepie 可以拆分左右兩半為相同的字串 pie 和 pie,但抽出的兩支籤為 foo 和 bar 時則不滿足條件。 神奇的是,若抽到的兩支籤ST為聖筊,則不管是將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)

解題報告:

  1. 這段代碼使用for迴圈集合中的每個字串i,並檢查其兩端是否相同(通過索引idx來檢查)。
  2. 如果兩端相同,並且去掉兩端相同部分之後的中間部分也在集合c中,那麼這是一個有效的字串對。
  3. 每找到一個這樣的對,就將total加1。最後,輸出total的值,即符合條件的字串對數量。

本題重點:

  1. 字串分割

    • 假設輸入abyyyab,我們需要檢查這個字串的兩端部分是否相同。這可以通過for迴圈字串的一半來完成,檢查每一部分的開頭和結尾是否相同:if i[:idx] == i[-idx:]
  2. 使用set()搜尋

    • 使用Python內建的set()來儲存所有的字串。接下來,我們檢查去掉兩端相同部分之後的中間部分是否存在於這個集合中:if i[idx:-idx] in c。這樣可以確保中間部分也是籤筒中的某個字串。

本題知識:

  • 枚舉
  • HASH
  • SET

  • [✔️] 程式碼如果需要可以直接使用。
  • [✔️] 分享貼文請標註來源。

image