Problem
博物館對於骨頭化石進行拼湊作業,每一個骨頭上用 A - Z 去標記。兩片骨頭可以連接則表示具有相同的英文字母。
現在有數組骨頭,上面會有數個街口。現在找一組骨頭集合,使得每一個接口都有其連接的對象,盡可能使集合越大越好。
Sample Input
|
|
Sample Output
|
|
Solution
題目相當於問找一個集合,使得每一個字母數量出現偶數次。
由於 N = 24,這個數量使用$O(2^{24})$ 相當消耗時間。使用中間相遇法 (在密碼學中可以見到,有點雙向 Bfs 的味道),也就是分治算法的概念,將問題對切,從兩個統計結果中找交集。算法降至$O(2^{12} \times 12)$
考慮前 N/2 個骨頭 A、後 N/2 個骨頭 B,分別找到在字母集出現狀態為 S 的最佳解 A1, B1,若將兩個相同狀態組合$S \text{ XOR } S = 0$ 符合出現偶數次的條件。
|
|