找了半天終於找到乙個可以提交的地方。。。
題解:任何乙個重複子串,都必然是某兩個字尾的最長公共字首。
因為,兩個字尾的公共字首,它出現在這兩個字尾中,並且起始位置時不同的,所以這個公共字首必然重複出現兩次以上(可重疊)。
而任何兩個字尾的最長公共字首為某一段height值中的最小值,所以最大為height值中的最大值(即某個lcp(sa[i],sa[i+1]))。
所以只要算出height陣列,然後輸出最大值就可以了。
view code
1 #include 2 #include 3 #include 4 #include 5 #include 67#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...