切換
舊版
前往
大廳
主題

ZeroJudge - a223: 10298 - Power Strings 解題心得

Not In My Back Yard | 2020-07-31 00:00:02 | 巴幣 0 | 人氣 511

題目連結:


題目大意:
輸入有多列,每列給定一字串 s (1 ≦ |s| ≦ 1000000 。當 s = "." 時,代表輸入結束),請找到 s 的子字串 a 使得 s = a ^ n 之 n 值最大。

其中,a ^ n 代表為 a * (a ^ (n - 1)) ,而 a * b 代表 a 字串與 b 字串接在一起。且 a ^ 0 定為空字串。因此 a ^ n 代表的是 n 個 a 字串接在一起。



範例輸入:
ABCD
AAAA
ababab
.


範例輸出:
1
4
3


解題思維:
因為要使 n 值盡量地大,因此字串 a 要盡量地短。所以我們可以從 i = 1 開始逐步地增加 i 值,代表看 s 字串的前 i 個字元可否為一個合法的 a 。因此就要判斷 s[0] 是否等於 s[i] 、 s[2i] …… 、 s[1] 是否等於 s[i + 1] 、 s[2i + 1] …… 、 s[i - 1] 是否等於 s[2i - 1] 、 s[3i - 1] 等等。

以上等式都要成立,前 i 個字元才是一個合法的 a 。此時 n 值即是 s 字串長度 ÷ a 字串長度。可以看到 a 的長度即為 i ,所以倘若 s 字串長度無法被 i 整除,即代表這個 a 一定不合法(因為一定找不到一個 n 值滿足 s = a ^ n)。




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

創作回應

更多創作