重複子串:字串s在字串t中至少出現兩次,則稱s是t的重複子串
一、最長可覆蓋的重複子串
只需求出字串的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,一直遞減下去,直到...