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

2021-05-24 12:01:30 字數 1164 閱讀 8770

時間限制:

1000

ms  |  記憶體限制:

3000

kb

描述

對於乙個字串s1,其中s2是他的乙個子串(長度嚴格小於s1長度),如果s2在s1中出現次數超過1次,那麼s2就是乙個重複子串,現在的要求是給定s1,請求出他的最長重複子串;

如果有多個長度一樣的最長子串,請輸入字典序最小那個串;

比如bbbaaaccc

那麼最長子串就是aa

輸入

第一行包含乙個整數t,表示有t組資料

對於每組資料報含一行,該行有乙個字串,長度小於10,000

輸出 對於每組資料請輸出他的最長重複子串,保證每組資料都有;

樣例輸入

2

abacabac

abacabbac

樣例輸出

abac

bac

#include

#include

#include

using namespace std;

///字尾陣列  倍增演算法

const int maxn=500000;

char str[maxn];

int wa[maxn],wb[maxn],wv[maxn],wn[maxn],a[maxn],sa[maxn];

int cmp(int* r,int a,int b,int l)

/**n為字串長度,m為字元的取值範圍,r為字串。後面的j為每次排

序時子串的長度*/

void da(int* r,int* sa,int n,int m)

}for(int i=pos,j=0;j<_max;i++,j++) printf("%c",str[i]);printf("/n");

}return 0;

}/**

2.字尾的最長公共字首。(記為lcp(x,y))

這是height陣列的最基本性質之一。具體的可以參看羅穗騫的**。

字尾i和字尾j的最長公共字首的長度為它們在sa陣列中所在排位之間

的height值中的最小值。這個描述可能有點亂,正規的說,令x=rank[i],y=rank[j],

x解決這個問題,用rmq的st演算法即可*/

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

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

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

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

字尾陣列求最長重複子串

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