#13061: 尋找最小字串


nkavengertree (LaG)

學校 : 不指定學校
編號 : 62501
來源 : [49.216.191.28]
最後登入時間 :
2021-11-21 03:06:49
a223. 10298 - Power Strings -- UVa10298 | From: [118.169.49.180] | 發表日期 : 2017-11-29 10:47

這個方法是參考KMP演算法的,如果已經會的可以直接跳過。

假如字串為:A B C A B B C

A B C A B B C

0

A B C A B B C

0 0

A B C A B B C

0 0 0 1              (發現重複)

A B C A B B C

0 0 0 1 2            (發現重複)

A B C A B B C

0 0 0 1 2 0

A B C A B B C

0 0 0 1 2 0 0

-----------------------------------------------------------------

以上的字串為最小字串,所以答案為1

-----------------------------------------------------------------

換一個簡單的範例: A B C A B C

B C A B C

0

A B C A B C

0  0

A B C A B C

0  0  0 

B C B C

0  0  0  1                (發現重複)

C A

0  0  0  1  2            (發現重複)

A B A B

0  0   0  1  2  3       (發現重複)  

-----------------------------------------------------------------

以上範例最小字串為【ABC】,所以答案為2

-----------------------------------------------------------------

觀察以上的兩個情況,可以使用【從右往左】數過來【第一個0的位置來判斷,

1.【當0的位置】超過【字串長度一半】時,代表這個字串連一半都不能切割,所以答案必為1。

2.【當0的位置】不能整除【全部字串長度】時,代表不能剛好分割,所以答案為1。

3.【當0的位置】都符合時,答案就會是【全部字串長度】/【0的位置】。

4.【全部字串長度】如果一開始為1的話,不用檢查,答案為1。

ABABC為例子,【全部長度】為6,最後一個【0的位置】為3      <---------  string的字元編號是從0開始,所以記得要把 (位置+1)!!

答案為: 6/3 = 2

A B A為例子,【全部長度】為5,最後一個【0的位置】為2

因為5%2 != 0,答案為:1

A B C A B B C 為例子,發現B的位置沒有重複且超過【字串的一半】,所以答案為:1

-----------------------------------------------------------------

以上為自己思考的方法,如果有地方有問題,請各位提出來,感謝各位,希望能幫助到大家。

PS如果要加快速度,可能要在讀取的地方下手

AC(0.8s, 3.1MB)  >>>   AC(28ms, 2.3MB)

 

 
#13626: Re:尋找最小字串


proudsun (青炎玉鴞)

學校 : 元智大學
編號 : 48921
來源 : [60.251.45.137]
最後登入時間 :
2019-09-11 11:19:03
a223. 10298 - Power Strings -- UVa10298 | From: [36.229.100.74] | 發表日期 : 2018-03-30 21:50

感謝解說,KMP演算法看懂了

 

另外我的程式無論如何都沒辦法把使用空間減到5MB以下,佩服

 
ZeroJudge Forum