# **APCS Jan 2022 - h083 [Q3](https://zerojudge.tw/ShowProblem?problemid=h083) [Python]** > **本題敘述:** > >占卜籤筒有`M`支籤,每一支籤為一個由英文小寫字母組成的字串。從籤筒內抽出兩支籤,若將這兩支籤上的字串`S`和`T`連接起來形成的字串可以將該字串拆成左右兩半並且內容一樣,則抽到聖筊代表神明同意,否則神明不同意或是沒回答。 > > 例如抽出的兩支籤上的字串分別為 piep 和 ie,則相連接起來的字串為 piepie 可以拆分左右兩半為相同的字串 pie 和 pie,但抽出的兩支籤為 foo 和 bar 時則不滿足條件。 > 神奇的是,若抽到的兩支籤`S`和`T`為聖筊,則不管是將`T`接在`S`後面或是順序反過來接起來,都可以是聖筊,再次說明了這兩支籤有著某種神秘力量在祝福著抽到的幸運人。例如 piep 和 ie 不管是使用 piepie 或是 iepiep 都可以拆分成兩個一樣的字串。 > > 詢問籤筒內這`M`支籤,有幾個 pair 可以形成聖筊。相同的兩支籤組合計算一次即可。 ```python= 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](https://hackmd.io/_uploads/B188K_YER.png)