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