题意简述
给定一个长度的字符串,请你求出所有前缀中,出现次数乘以前缀长度的最大值。
思路框架
求一遍然后,求的最大值。
具体思路
前缀的出现次数??自动机?
但是如果要一个一个弄的话,无论如何都要。那咋整嘛。
考虑前缀的一次出现。有什么规律?
如图。红色部分为一个长度为的前缀,在的某个位置出现了。
然后就说明,在蓝色部分,长度为的前缀=后缀。
前缀=后缀?有点熟悉呢。联想到中的数组。是前缀个中,最长的前缀=后缀的长度。我们取,直到取到为止,就是前缀个中所有前缀=后缀的长度了。而且珂以证明,如果我们像这样一个点不断取来枚举每个前缀的出现次数,显然
- 不会少算
- 不会多算
那么,设表示长度为的前缀在中出现的次数。我们枚举一个,然后不断取,对于每个,。
这样的复杂度看起来不错。但是,如果中全是一个字符a,容易证明,这个算法退化了,变成。
那咋整嘛。一眼看去好像不行了。然鹅,在仔细看一眼,就会发现一个很显然的优化:把的初始值设成,然后从到枚举,,就解决了。这个优化的核心就在于,我们用代替,就省得每次跑一遍了。
实现注意
- 开longlong
- 数组名不要叫next,会重名的
代码
1 |
|