時間限制:
1000
ms | 記憶體限制:
3000
kb
描述
對於乙個字串s1,其中s2是他的乙個子串(長度嚴格小於s1長度),如果s2在s1中出現次數超過1次,那麼s2就是乙個重複子串,現在的要求是給定s1,請求出他的最長重複子串;
如果有多個長度一樣的最長子串,請輸入字典序最小那個串;
比如bbbaaaccc
那麼最長子串就是aa
輸入
第一行包含乙個整數t,表示有t組資料
對於每組資料報含一行,該行有乙個字串,長度小於10,000
輸出 對於每組資料請輸出他的最長重複子串,保證每組資料都有;
樣例輸入
2abacabac
abacabbac
樣例輸出
abacbac
#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,一直遞減下去,直到...