zerojudge網址 https://zerojudge.tw/ShowProblem?problemid=h083
占卜籤筒有m支籤,每一支籤為一個由英文小寫字母組成的字串。從籤筒內抽出兩支籤,若將這兩支籤上的字串S和T連接起來形成的字串可以將該字串拆成左右兩半並且內容一樣,則抽到聖筊代表神明同意,否則神明不同意或是沒回答。
例如抽出的兩支籤上的字串分別為 piep 和 ie,則相連接起來的字串為 piepie 可以拆分左右兩半為相同的字串 pie 和 pie,但抽出的兩支籤為 foo 和 bar 時則不滿足條件。
神奇的是,若抽到的兩支籤S和T為聖筊,則不管是將T接在S後面或是順序反過來接起來,都可以是聖筊,再次說明了這兩支籤有著某種神秘力量在祝福著抽到的幸運人。例如 piep 和 ie 不管是使用 piepie 或是 iepiep 都可以拆分成兩個一樣的字串。
詢問籤筒內這m支籤,有幾個 pair 可以形成聖筊。相同的兩支籤組合計算一次即可。
輸入說明
輸入一個正整數m,接下來有m的字串,每個字串長度最長為100。
數字範圍
(1)1<=m<=50000
(2)籤筒內所有字串均相異
輸出說明
輸出一個正整數,代表有幾個 pair 滿足條件。
輸入範例
3
a
aba
aaa
5
abyyyab
y
yy
yyy
yyyy
輸出範例
1
3
提示 :
範例 1
總共有 1 組,為 {aaa, a}
範例 2
總共有 3 組,分別為 {abyyyab, yyy}, {yyy, y}, {yyyy, yy}
解題步驟
找出首尾一樣的字串,例如:abyyyab的ab,只要找出yyy是否出現過,接著使用二元搜尋(binary_search)確定yyy是否出現過,檢查每個字串為O(n),字串如果首尾相同則需要二元搜尋找出字串是否存在需要O(log(n)),排序字串需要O(n*log(n)),當n遠大於字串長度時,字串長度可以忽略,整體演算法效率為O(n*log(n))