hihocoder 字尾陣列

2021-09-27 04:18:09 字數 1269 閱讀 6899

時間限制:5000ms

單點時限:1000ms

記憶體限制:256mb

描述小hi平時的一大興趣愛好就是演奏鋼琴。我們知道乙個**旋律被表示為長度為 n 的數構成的數列。

小hi在練習過很多曲子以後發現很多作品自身包含一樣的旋律。旋律是一段連續的數列,相似的旋律在原數列可重疊。比如在1 2 3 2 3 2 1 中 2 3 2 出現了兩次。

小hi想知道一段旋律**現次數至少為k次的旋律最長是多少?

解題方法提示 輸入

第一行兩個整數 n和k。1≤n≤20000 1≤k≤n

接下來有 n 個整數,表示每個音的數字。1≤數字≤100

輸出一行乙個整數,表示答案。

樣例輸入

8 212

3232

31

樣例輸出

4
解題思路:字尾陣列模板題,直接二分答案,根據height陣列o(n)的check一下。記錄一下模板

出處找不到了。。。

#include#include#include#include#includeusing namespace std;

const int maxn = 20005;

int wa[maxn],wb[maxn],wv[maxn],ws[maxn];

int rak[maxn],height[maxn];

int sa[maxn];

int s[maxn];

/// sa[i] 排第i的是哪個串 rak[i] 第i個串排第幾

/// sa[1~n]有效 rak[0~n-1]有效

/// 定義 height[i]為suffix(sa[i-1])和 suffix(sa[i]),即排名相鄰的字尾的最長公共字首

/// height[2~n]有效

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

///m是計數排序上限 r是要處理的陣列

///n是陣列長度+1,最後乙個元素的後乙個位置

///計數排序最小元素從1開始

/// m的範圍 如果字串只包含字母就取128 否則取最大的數字+1。

void init()

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

return false;

}void read()

printf("%d\n",ans);

}int main()

hihocoder1415 字尾陣列三 重複旋律3

傳送門 題解 考慮求出兩串合在一起 中間加分隔符 字尾陣列,就是要求任意在兩個串中的 i,j min i leq k leq j 的最大值。考慮 i,j 一定是滿足 i j 1 且合法的時候最優。詳情見 hihocoder 解題方法提示 include include include include...

HihoCoder1415字尾陣列三 重複旋律3

時間限制 5000ms 單點時限 1000ms 記憶體限制 256mb 描述小hi平時的一大興趣愛好就是演奏鋼琴。我們知道乙個 旋律被表示為長度為 n 的數構成的數列。小hi在練習過很多曲子以後發現很多作品中的旋律有共同的部分。旋律是一段連續的數列,如果同一段旋律在作品a和作品b中同時出現過,這段旋...

字尾樹 字尾陣列

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