天天看點

SPOJ 687 Repeats(字尾數組+ST表)

【題目連結】 http://www.spoj.com/problems/REPEATS/en/

【題目大意】

  求重複次數最多的連續重複子串的長度。

【題解】

  考慮錯位比對,設重複部分長度為l,記s[i]和s[i+l]字首比對得到的最長長度為r,枚舉所有的l和i,得到r,那麼答案就是r/l+1的最大值。計算任意字尾的最長公共字首可以利用字尾數組+ST表來解決,兩個字尾的最長公共字首就是他們名次之間的h數組的最小值。 

  顯然,枚舉i和l的複雜度達到了O(n2),是沒有辦法完成統計的,我們發現每個區段隻會存在一個最大值,是以我們以l為步長枚舉i,通過計算一次LCP獲得這個最長長度的起始位置k,再求一次k位置和k+l位置的LCP,就可以得到這個區段的答案。

【代碼】

  

願你出走半生,歸來仍是少年