最長可重疊的重複子串

2022-08-26 14:54:17 字數 516 閱讀 9074

題目大意:給定乙個字串,求它的最長可重疊的重複子串的長度

思路:求出height陣列之後,輸出最大值即可。因為最長可重疊的重複子串一定是在相鄰兩個字尾的最長公共字首,即height,而要求最大值,輸出height最大值即可

#include#include#define max(a,b) a>b?a:b

using namespace std;

const int maxl=400000;

int sa[maxl+10],tsa[maxl+10],rank[maxl+10],trank[maxl+10],sum[maxl+10],n,h[maxl+10];

char s[maxl+10];

void sorts(int j)

void getsa()

for (int j=1;j<=n;j*=2)

memcpy(rank,trank,sizeof(rank)); }}

void geth()

}int main()

最長可重疊的重複子串(2)

勇幸 thinking 首先這是乙個單字串問題。子字串r 在字串l 中至少出現兩次,則稱r 是l 的重複子串。重複子串又分為可重疊重複子串和不可重疊重複子串,這裡只是簡單討論最長可重疊的重複子串,給出基本演算法和基於字尾陣列的演算法 關於字尾陣列,這裡也只是用最簡單的形式實現,對於字尾陣列的倍增演算...

求最長可重疊重複子串

問題描述 給定乙個字串,求出其可重疊最長重複子串 例如 abcdabcd 最長重複子串是 abcd,最長重複子串可以重疊 例如 abcdabcda,這時最長重複子串是 abcda,中間的 a 是被重疊的。直觀的解法是,首先檢測長度為 n 1 的字串情況,如果不存在重複則檢測 n 2,一直遞減下去,直...

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

找了半天終於找到乙個可以提交的地方。題解 任何乙個重複子串,都必然是某兩個字尾的最長公共字首。因為,兩個字尾的公共字首,它出現在這兩個字尾中,並且起始位置時不同的,所以這個公共字首必然重複出現兩次以上 可重疊 而任何兩個字尾的最長公共字首為某一段height值中的最小值,所以最大為height值中的...