開始是用字尾陣列做的,rmq果斷超了記憶體,全部改用unsigned short結果又超時,後來參考了**裡的方法。
關鍵思想是設k為最小重複字串的長度,則s[0,1……n-k-1]=s[k,k+1……n-1],即lcp(rank[0],rank[k])=n-k;由於0位置是固定的,只需要對名次迴圈求出最小的k就行!
其複雜度為o(n),可是還是超時,因為字尾陣列預處理的時間是n*log(n),覺得這題是卡了字尾陣列這種方法應該是行不通了,後來一搜,結果全是kmp的,直接根據next陣列就可以計算出來,汗啊!
參考:1.kmp**
#include#include#includeusing namespace std;
//poj2406
#define n 1000010
char p[n];
int n;
int next[n]=;
void getnext()//注意迴圈的邊界!
cout<
POJ2406 KMP字首週期
題意 給你乙個字串,長度小於1百萬,問你他最多可以拆成集合相同字串,例如abcabcabc 可以拆成3個abc,所以輸出3.思路 這個是比較常規的next應用,首先假設當前字串長度n 那麼 n next n 字首為最短子串長度,如果n next n 0 n n next n 0,說明最後乙個字串是長...
POJ 3080 字尾陣列 KMP
題意 給定n個dna串,求最長公共子串。如果最長公共子串的長度小於3時輸出no significant commonalities,否則輸出該子串,如有多解請輸出字典序最小的解 思路 是poj 3405的弱化版。思路請參考 define crt secure no deprecate include...
POJ 2406 字尾陣列 求連續重複子串
解法一 dc3求字尾 因為我用的是紅書的字尾模板,所以是倍增求的,所以這個dc3是用這個部落格的模板 這個也是勉強過的,時間為 2829ms了,寫得不機智就會超了。include include define n 2000005 define f x x 3 x 3 1?0 tb define g ...