P2844【APIO2014】回文串
问题描述
考虑一个只包含小写英文字母的字符串s。我们定义s的一个字串t的“出现价值”为t在s中出现的次数乘以t的长度。请求出s的所有回文子串中的最大“出现价值”。
输入格式
输入只有一行,为一个只包含小写字母的非空字符串s。
输出格式
输出一个整数,为最大的回文子串价值。
样例输入1:
abacaba
样例输入2:
www
样例输出1:
7
样例输出2:
4
首先,此题是回文树模板题。
然后当然可以用朴素做法解决。
由于要查找回文串,考虑Manacher,然后需要查找回文串的出现次数,考虑后缀自动机。
显然的做法是在Manacher过程中,每找到一个回文串,就在自动机上从根开始跑,查找他的出现次数。
注意到事实上同样的回文串不需要多次运算,那么在Manacher过程中只需要在每次超出Max进行拓展时在自动机上查找即可。由于最多拓展n次,那么最多只需要查找n次。
但这样显然要超时,考虑优化查找速度,注意到每个串在自动机上都对应到了一个节点上,而parent树上该串必然是子节点串的后缀,那么考虑在parent树上倍增查找。
只需要在构建自动机的时候记录下每个字符为结尾,对应的节点编号,然后建完后每次从该结尾处倍增往上跳即可。查找复杂度$log_2{n}$
代码:
1 |
|