分享到plurk 分享到twitter 分享到facebook

[POJ] 2752 - Seek the Name, Seek the Fame

..

上方由 — … 所包起來的是 meta data 請依照題目填寫

title: [OJ Name] 題號 - 題目名稱

categories: 題解、題目類型、演算法名稱、資料結構名稱

網址

http://poj.org/problem?id=2752

題目概述

給你一個字串,求 prefix=suffix 的substring的長度,長度由短到長依序輸出

Technique details

每行一個字串,1 <= 字串長度<= 400000.讀到檔案結尾

輸入格式

::

ababcababababcabab aaaaa

輸出格式

::

2 4 9 18 1 2 3 4 5

解題思路

根據KMP next 數組的特性,我們知道 next[len-1]所標示出的為prefix=suffix的最長位置 也就是 s[0]~s[ next[len-1]]=s[ len-1-next[len-1] ] ~s[len-1] , 那麼

  • 次長的字串S’必定被包含於較長的字串S 因為次長字串S’為S的prefix同時也為S的suffix,這點畫圖可以證明,所以我們可以當作S字串中有兩個S’(prefix 以及 suffix)

那麼根據next的性質,依序跑就對了,變成 cur=len-1, 第一長的:next[cur]+1 ;cur=next[cur],第二長的為next[cur]…依序下去,最後反向輸出!!