description
小 hi 平時的一大興趣愛好就是演奏鋼琴。 我們知道乙個**旋律被表示為長度為 n的數構成的數列。
小 hi 在練習過很多曲子以後發現很多作品中的旋律有重複的部分。
我們把一段旋律稱為( k , l )-重複的, 如果它滿足由乙個長度為 l 的字串重複了 k 次組成。 如旋律 abaabaabaaba 是(4,3)重複的, 因為它由 aba 重複 4 次組成。
小 hi 想知道一部作品中 k 最大的(k,l)-重複旋律。
一行乙個僅包含小寫字母的字串 。 字串長度不超過 100000。
一行乙個整數, 表示答案 k。
babbabaabaabaabab
資料約束:
30%的資料 n<=1000
70%的資料 n<=10000
100%的資料 n<=100000
題解:
容易想到判斷迴圈結延伸的長度就是i和i+k(k為迴圈結長度)的lcp,求兩個字尾的lcp顯然就是高度陣列對應的一段的最小值
rmq維護即可
接著就是難點,我們不必列舉每乙個位置,只需列舉k的倍數
但是可能存在情況:使得i+l i+l+1 (1<=l<=k)使得次數大了1
但是顯然我們可以o1的找出這個位置的答案 即為 lcp(i-k+r%k,i+r%k) r為lcp(i,i+k) 可以畫個圖理解下
r%k是求出lcp不能形成新迴圈的多出來的一段 那麼我們就直接求lcp即可
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7using
namespace
std;
8const
int n=100005;9
int s[n],n=0,rk[n],sa[n],tmp[n],k;char
s[n];
10bool comp(int i,int
j)16
void
getsa()
20for(k=1;k<=n;k<<=1)26
}27inthigh[n];
28void
gethight()36}
37int f[n][25
];38
int query(int l,int
r)42
void
prework()51}
52}53int lcp(int x,int
y)57
intmain()
5874}75
}76 printf("
%d\n
",ans);
77return0;
78 }
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中同時出現過,這段旋...
hihocoder 字尾自動機四 重複旋律6
題目 對於 k in 1,n 求出長度為 k 的子串出現次數最多的出現了多少次 我直到現在才理解字尾自動機上的子樹和是什麼意思 非常顯然的一點是 endpos link u endpos u 考慮到 link u 有多個兒子 於是還需要 endpos 的另外乙個性質 endpos u endpos ...