uva11107 字尾陣列

2021-06-28 13:27:15 字數 844 閱讀 9697

給定n個字串,求長度最大的字串(不一定是原字元),在超過一半的字串中連續出現

1.將n個字串通過特殊字元連線起來,合成乙個文字串。題目轉化為尋找匹配點的對應字串個數超過n/2最長字串

2.二分答案求出最大值。

二分最大值的基礎:如果對於x成立,則對於不大於x的所有值都成立,則可以二分最大值

3.判斷是否存在長度不小於p的串在超過n/2的不同字串區域出現

如何判斷?

結論:heigh>=len的連續區間內的所有字串的lcp長度》=len

證明:根據hdight陣列的定義可證。

掃瞄height陣列,尋找height值》=len的連續區間,根據結論,lcp長度》=len,且lcp在區間內所有字串中出現。對區間內每個元素尋找對應原字串的序號,若不同序號值》n/2,則存在上述字串。否則不存在。

#include#include#includeusing namespace std;

const int maxn=1001*100+10;

struct suffixarray

//m為最大字元值加1,呼叫前需設定好s和n

void build_sa(int m)

}void build_height()

void print_sub(int l,int r){

for(int i=l;i0) printf("\n");

int maxlen=0;

sa.clear();

for(int i=0;i

UVa11107 字尾陣列

這題由於這週六考大物,整整拖了一周時間,一開始寫的我估計也沒什麼大問題,細節比較多 1.字元陣列直接寫成int陣列,並且最後一位s n 0,來維護sa陣列,height陣列 記錄lcs rank陣列 2.二分的技巧,也看到了很多 3.看來劉汝佳的書寫的也不是很完美,對於字尾陣列雖然給了標程,但是具體...

UVA 11107 生命的形式(字尾陣列 LCP)

把所有輸入的字串拼起來,二分答案,每次判斷是否有乙個長度為p的串在超過一半的串中連續出現,判斷方法是掃瞄height陣列,因為height陣列中,相同串長度都聚集在一起。includeusing namespace std const int maxn 100005 char s maxn int ...

字尾樹 字尾陣列

在字串處理當中,字尾樹和字尾陣列都是非常有力的工具,其中字尾樹大家了解得比較多,關於字尾陣列則很少見於國內的資料。其實字尾陣列是字尾樹的乙個非 常精巧的替代品,它比字尾樹容易程式設計實現,能夠實現字尾樹的很多功能而時間複雜度也不太遜色,並且,它比字尾樹所占用的空間小很多。可以說,在資訊學競賽 中字尾...