L. 奶牛序列
題意
- 約翰剛幫奶牛們拍完照,拿着合影的他,看着奶牛隊列,又莫名想到了一個字符串問題:
我們將n頭奶牛的隊列看成一個長爲n的字符串S,讓Ti表示從第i的字符開始的後綴。求: - 其中,len(a)表示字符串a的長度,lcp(a,b)表示字符串a和字符串b的最長公共前綴,輸入字符串長度不超過5e5
分析
首先前面的len(Ti)和len(Tj)可以提取出來一步算出來,剩下主要就是求
lcp(Ti,Tj)的和,在後綴數組中求兩個後綴的最長前綴長度,就是求各自對應h[i]數組間的最小值。由於這裏i和j把所有的一對Ti和Tj組合都取遍,所以這裏可以轉換成求所有h[i]和h[j]數組中間的最小值的和的兩倍那麼問題轉換成求所有h[i]和h[j]數組中間的最小值的和,,如何快速的求出所有和呢,因爲枚舉會T。這裏用到nlogn求最長公共子序列的思想。每一次我只求所有h[j]和h[i]之間的最小值的和(其中j
思考
這題想到就不難了,當然實現的時候還是要想半天的
求最長公共子序列這種nlogn的思想很實用。