字尾陣列的應用 重複子串

2021-07-09 07:11:06 字數 1656 閱讀 7990

重複子串:字串s在字串t中至少出現兩次,則稱st的重複子串

一、最長可覆蓋的重複子串

只需求出字串的sa ,height陣列,答案就是height中最大的那個。

二、最長不可覆蓋的重複子串 (poj 1743)

求出height陣列,二分答案。問題就轉變成了是否存在兩個長度為k的相同字串,且不重疊。按k分組,若height [ i ] < k就重新分一組(如圖)。對於每一組,如果這組中的sa的最大值與最小值的差大於等於k就存在不重疊的,否則不存在。

}三、可覆蓋 k 次的最長重複子串

和上一題的思路差不多,二分答案。判斷時看每組的個數是否大於等於k,如果是就存在,否則不存在。

#include #include using namespace std;

const int max_n = 20005;

int n, k, a[max_n], sa[max_n], r[max_n], h[max_n];

int wa[max_n], wb[max_n], ws[1000005], wv[max_n];

void da(int *a, int *sa, int n, int m) }

void calc()

}bool check(int x)

} return 0;

}void init()

void doit()

printf("%d\n", ans);

}int main()

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

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

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

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

字尾陣列求最長重複子串

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