切換
舊版
前往
大廳
主題

ZeroJudge - d578: 小涵的積木 解題心得

Not In My Back Yard | 2020-07-01 01:33:43 | 巴幣 2 | 人氣 179

題目連結:


題目大意:
輸入有多列測試資料。每筆第一列給定兩正整數(n ≦ 10000000,2 ≦ m ≦ 25),代表有 m 組積木組,每組積木組有 n 塊積木。每組的積木組內容物都是相同的,但是內容物可以有不同種的方塊。

接著有 n × m - 1 列輸入,每列給定一個字串(包含除了換行符號以外的任意可顯示字元(ASCII 下的字元),長度不超過 1000 個字元),代表其中一塊積木的種類編號。請找到那一塊遺失的(因為現在只有 n × m - 1 個積木)積木之字串編號。



範例輸入:
3 3
apple
orange
banana
orange
apple
apple
banana
banana
4 2
D.R S
P@#$sK!
Aplcme U
Aplcme U
H.NK ;M
P@#$sK!
D.R S
0 0


範例輸出:
orange
H.NK ;M


解題思維:
用雜湊將字串編號,然後跑過所有存在的積木種類去找哪個編號的積木不能被 m 整除(代表該種積木少了一個,因為每組積木組合都是一樣的),進而找到缺少的積木之對應字串。

以上的作法有一個巨大的問題:
因為積木數量可以很多,最多可以有 10000000 種積木,也就是每組積木組裡面每個積木都不一樣。所以如果這樣做,最差就是要跑 10000000 種積木對應的字串。這樣基本上會超時,因為測試資料不只一組。



因此,我們可以換個方向。因為字串最長不超過 1000 個字元,而 ASCII 編碼裡面有 128 種字元。所以我們可以開一個 1000 × 128 的二維陣列。1000 對應到字元的位置,128 對應到 ASCII 字元數。

所以,我們掃過每個進來的字串,統計每個位置(0 ~ 999)出現的每種字元數 (0 ~ 127)。而因為我們少了一塊積木,所以每個位置會有一種且僅有一種字元,其數量是不能被 m 整除的。藉此我們就能找出缺少的積木之字串應為何者。

而這樣之需固定跑 1000 × 128 = 128000 ,相比一開始的做法的最差情況好上非常地多。

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

創作回應

胖胖貓
整理一下相同概念的題目:
M=2時, d708
M=3時, e319
M不確定時, c489
2020-07-01 02:33:24
Not In My Back Yard
感謝補充。
2020-07-01 02:36:43

更多創作