Lweb 面对如山的英语单词,陷入了深深的沉思,「我怎么样才能快点学完,然后去玩三国杀呢?」。这时候睿智的凤老师从远处飘来,他送给了 Lweb 一本计划册和一大缸泡椒,然后凤老师告诉 Lweb ,我知道你要学习的单词总共有 n n n 个,现在我们从上往下完成计划表,对于一个序号为 x x x 的单词(序号 1 ∼ x − 1 1 \sim x-1 1∼x−1 都已经被填入):
如果存在一个单词是它的后缀,并且当前没有被填入表内,那他需要吃 n × n n \times n n×n 颗泡椒才能学会;当它的所有后缀都被填入表内的情况下,如果在 1 ∼ x − 1 1 \sim x-1 1∼x−1 的位置上的单词都不是它的后缀,那么他吃 x x x 颗泡椒就能记住它;当它的所有后缀都被填入表内的情况下,如果 1 ∼ x − 1 1 \sim x-1 1∼x−1 的位置上存在是它后缀的单词,所有是它后缀的单词中,序号最大为 y y y ,那么他只要吃 x − y x-y x−y 颗泡椒就能把它记住。Lweb 是一个吃到辣辣的东西会暴走的奇怪小朋友,所以请你帮助 Lweb,寻找一种最优的填写单词方案,使得他记住这 n n n 个单词的情况下,吃最少的泡椒。
1 ≤ n ≤ 100000 1 \le n \le 100000 1≤n≤100000 , 所有字符的长度总和 1 ≤ ∣ l e n ∣ ≤ 510000 1 \le |len| \le 510000 1≤∣len∣≤510000
好冗长难懂的题目qwq
考虑反串建立 t r i e trie trie ,将结束位置标为关键点,将关键点拉出构成一个树,可以看出要先取走父亲再取走儿子。
问题就变为对每个点分配权值 a a a 使得 a i ∈ [ 1 , n ] a_i \in [1,n] ai∈[1,n] , a i > a f a i a_i>a_{fa_i} ai>afai 且 ∑ a i − a f a i \sum a_i-a_{fa_i} ∑ai−afai 最小。
可以发现 ∑ a i \sum a_i ∑ai 使一定的,于是考虑 ∑ a f a i \sum a_{fa_i} ∑afai 的贡献最大即可。
考虑一下不同子树大小间的比较,即有两个子树 x , y x,y x,y , s i z e x < s i z e y size_x<size_y sizex<sizey ,如果先走 x x x 子树贡献为 A A A ,先走 y y y 子树贡献为 B B B ,所以先走 x x x 子树两个子树的贡献是 A + B + ( s i z e x + 1 ) × s i z e y A+B+(size_x+1) \times size_y A+B+(sizex+1)×sizey ,先走 y y y 子树两个子树的贡献是 A + B + ( s i z e y + 1 ) × s i z e x A+B+(size_y+1) \times size_x A+B+(sizey+1)×sizex ,作差结果为 s i z e y − s i z e x > 0 size_y-size_x>0 sizey−sizex>0 ,所以先走小子树更优。
因此从子树小的往下遍历即可。
