poj3693(字尾陣列 lcp rmq)

2021-08-03 22:02:23 字數 828 閱讀 8885

求迴圈節個數最大的子串。

先窮舉長度l,然後求長度為l 的子串最多能連續出現幾次。首先連續出現1 次是肯定可以的,所以這裡只考慮至少2 次的情況。假設在原字串中連續出現2 次,記這個子字串為s,那麼s 肯定包括了字元r[0], r[l], r[l*2],r[l*3], ……中的某相鄰的兩個。所以只須看字元r[l*i]和r[l*(i+1)]往前和往後各能匹配到多遠,記這個總長度為k,那麼這裡連續出現了k/l+1 次。

以上來自羅穗騫**

往後匹配多遠 r 用st表求lcp即可。。。往前 l 就把串反過來再做一下。。

但是開頭可以在[i-l,i-l+(l+r)mod len]區間內任取,我們要取字典序最小的,即rank最小的。再對rank做個st表就好了。

當然l也可以直接算。。想知道如何做的可以參看下別人的**。。還有些細節見**。

#include #include #define inf 0x7fffffff

#define n 100005

inline int swap(int &x,int &y)

inline int min(int x,int y)

}k=0;

for(int i=1;i<=n;++i)

if(i==1||h[rank[i-1]]<=1) k=0;

if(k) --k;

while(a[i+k]==a[sa[rank[i]-1]+k]) ++k;

h[rank[i]]=k;

} rmqini(st,h);

} int lcp(int x,int y)

return 0;

}

字尾陣列 poj 3693

題目 給出乙個串,求重複次數最多的連續重複子串 列舉長度為l,然後看長度為l的字串最多連續出現幾次。既然長度為l的串重複出現,那麼str 0 str l str 2 l 中肯定有兩個連續的出現在字串中。那麼就列舉連續的兩個,然後從這兩個字元前後匹配,看最多能匹配多遠。即以str i l str i ...

poj3693 字尾陣列

題意 給出一串字元,需要求這串字元中的最長重複子串,要是有多個,輸出字典序最小的.我自己的一些想法 這個思路我一開始倒是沒有看明白,慢慢的編下去,才懂了它到底是如何操作的.其實就是列舉多少個字元會匹配,然後求出它們的height值,再用這個值去除以長度,得到有多少個迴圈.具體看 include in...

POJ 3693 字尾陣列

題意 首先定義了乙個字串的重複度。即乙個字串由乙個子串重複k次構成。那麼最大的k即是該字串的重複度。現在給定乙個長度為n的字串,求最大重複次數的子串,有多解時輸出字典序最小解。思路 與spoj的題意差不多,可以點選這裡看 說下字典序的問題,想記錄size 最大重複次數,把所有滿足條件的長度l都記錄起...