題目大意:給定乙個字串,求它的最長可重疊的重複子串的長度
思路:求出height陣列之後,輸出最大值即可。因為最長可重疊的重複子串一定是在相鄰兩個字尾的最長公共字首,即height,而要求最大值,輸出height最大值即可
#include#include#define max(a,b) a>b?a:busing 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值中的...