hihoCoder 1419 重複旋律4

2022-05-11 11:57:29 字數 1507 閱讀 1692

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 7

using

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 ...