---
# System prepended metadata

title: APCS Jan 2022 - h083
tags: [apcs]

---

# **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)


