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