切換
舊版
前往
大廳
主題

ZeroJudge - a442: Necklace Problem (NP) 解題心得

Not In My Back Yard | 2020-09-09 00:00:08 | 巴幣 2 | 人氣 174

題目連結:


題目大意:
輸入有多筆測試資料,每筆佔兩列。測資的兩列輸入會各自給定長度 n (0 < n < 10000)的字串,每個字元只會是「0」 ~ 「9」其中一個,代表兩條項鍊的每顆珠子(注意頭與尾兩顆珠子是相鄰的,因為是一條項鍊)。

判斷這兩條是否為相同的項鍊。相同,則輸出「same」;反之,輸出「difference」。

注:項鍊可以翻面和旋轉,即從任何一個珠子作為起點順時針或是逆時針繞一圈回到起點。



範例輸入:
4263
6234
4263
4362


範例輸出:
difference
same


解題思維:
這題至少有三個解法:
(2023 / 6 / 30 更正:解法一是錯的,其僅適用於珠子種類都不同的時候)
解法一:因為兩條項鍊相同,表示它們的「結構」是相同的。也就代表著第一條項鍊每顆珠子的相鄰珠子會與第二條項鍊每顆珠子的相鄰珠子有一對一的關係。

例如第二筆測資中的兩條項鍊 4263 以及 4362 。可以看到第一條項鍊的 4 那顆珠子有著 3 以及 2 這兩顆作為相鄰珠子; 2 有相鄰的 4 和 6 ; 6 有 2 和 3 ; 3 有 6 和 4 。

而第二條項鍊也是 4 這顆珠子有 3 、 2 兩個鄰居; 3 對上 4 、 6 兩顆珠子; 6 碰上 3 以及 2 ;最後 2 有著 6 和 4 。

而第一筆測資可以看到兩條項鍊珠子,其各自的鄰居無法做一一對應。

因此,只要將所有珠子的鄰居珠子存起來。利用雜湊表(Hash Table)或是利用字典序排序後,看看兩條項鍊的鄰居對是否相同。如果完全相同,就表示兩條項鍊是相同的;反之,則不同。



解法二:如果兩條項鍊相同(令兩項鍊之字串為 N1 以及 N2),則代表 N2 是 N1 + N1 或是 N1' + N1' 的子字串(請注意,這邊是子「字串」不是子「序列」。前者是連續的、後者則不必連續)。其中,「+」代表著將左邊以及右邊的字串連接在一起形成一個新的字串,而 N1' 代表著「翻面」後的項鍊 N1 。

因為項鍊是一個環,而環則有兩個方向,逆時針以及順時針可以看環上面的元素。所以才有「翻面」的說法。



解法三:同樣令兩項鍊字串為 N1 和 N2。兩項鍊如果相同,則表示 N1 之最小表示法(Minimum Representation)或是 N1' (同解法二的 N1' 之意義)等於 N2 的最小表示法。

其中最小表示法,代表著一字串經由任意次「旋轉」(這邊的旋轉之定義,如此題)後所能產生的所有字串之中,字典序最小的即是該字串的最小表示法。

例如字串 4263 可以經由旋轉產生 4263 、 3426 、 6342 、 2634 四種字串,其中 2634 的字典序最小。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

心彩
我參考第一種解法 只是我不太清楚為什麼可以兩個字串的鄰居可以sort做比對
2023-06-30 15:13:45
Not In My Back Yard
因為每個珠子的鄰居都一樣的話,兩條項鍊各自依據「任何」方式 sort 都會長一樣;反之則不同,不管你再怎麼努力也不會變成一樣的。
2023-06-30 18:56:45
心彩
鄰居都一樣 則任何方式sort 都會長一樣 這裡不懂
2023-06-30 20:11:16
Not In My Back Yard
先說結論:解法一是錯的。

原因很簡單,因為現在的珠子種類可以重複。看看
31111311
31113111
這兩個項鍊的例子,就會知道解法一會是錯的。

如果今天種類不重複,解法一就會是正確的。可以用反證法去證(假設你有另一個不一樣的項鍊,但鄰居結構一樣。最後可以推出其實長一樣。),不過這邊看例子比較快:
123456789
所以可以看到鄰居關係為
(1, 2)
(2, 3)
(3, 4)
(4, 5)
(5, 6)
(6, 7)
(7, 8)
(8, 9)
(9, 1)
試圖推出幾個可能的項鍊你會發現要嘛只是起始點不同(例如 678912345)、要嘛方向不同(例如 987654321),再不然就是起始點和方向兩者一起不同(如 543219876)。而這些都跟原本是同一個項鍊。

所以我會更正一下內文,不過還是會保留解法一(因為珠子都不一樣就可以使用,只是不適用於本題)。
2023-06-30 20:50:04
Not In My Back Yard
至於解法二和解法三就只是把題目對於項鍊的操作重新描述而已,理應沒有問題。
2023-06-30 20:51:20

更多創作