最長重複子串(可重疊) 字尾陣列

2022-05-24 03:36:08 字數 834 閱讀 9161

找了半天終於找到乙個可以提交的地方。。。

題解:任何乙個重複子串,都必然是某兩個字尾的最長公共字首。

因為,兩個字尾的公共字首,它出現在這兩個字尾中,並且起始位置時不同的,所以這個公共字首必然重複出現兩次以上(可重疊)。

而任何兩個字尾的最長公共字首為某一段height值中的最小值,所以最大為height值中的最大值(即某個lcp(sa[i],sa[i+1]))。

所以只要算出height陣列,然後輸出最大值就可以了。

view code

1 #include 2 #include 3 #include 4 #include 5 #include 6

7#define n 5005089

using

namespace

std;

1011

intwa[n],wb[n],wc[n],wv[n];

12int

r[n],sa[n];

13char

str[n];

14int

rank[n],height[n];

1516 inline bool cmp(int *r,int a,int b,int

l)17

2021 inline void da(int *r,int *sa,int n,int

m)2240}

4142 inline void getheight(int *r,int *sa,int

n)43

4950 inline void

go()

5165

66int

main()

67

最長重複子串 可重複 字尾陣列

時間限制 1000 ms 記憶體限制 3000 kb 描述 對於乙個字串s1,其中s2是他的乙個子串 長度嚴格小於s1長度 如果s2在s1中出現次數超過1次,那麼s2就是乙個重複子串,現在的要求是給定s1,請求出他的最長重複子串 如果有多個長度一樣的最長子串,請輸入字典序最小那個串 比如bbbaaa...

字尾陣列(不可重疊最長重複子串)

poj 1743 二分答案,把題目變成判定性問題 判斷是否 存在兩個長度為k的子串是相同的,且不重疊。解決這個問題的關鍵還是利用 height陣列。把排序後的字尾分成若干組,其中每組的字尾之間的height值都 不小於k。有希望成為最長公共字首不小於k的兩個字尾一定在同一組。然 後對於每組字尾,只須...

最長可重疊的重複子串

題目大意 給定乙個字串,求它的最長可重疊的重複子串的長度 思路 求出height陣列之後,輸出最大值即可。因為最長可重疊的重複子串一定是在相鄰兩個字尾的最長公共字首,即height,而要求最大值,輸出height最大值即可 include include define max a,b a b?a b...