statement
给一个长为 \(n\) 的字符串 \(s\),字符集为 \(\{\text{o, v, w}\}\),请输出最长的回文子串,这个子串中一个 \(\text{w}\) 可以看成两个 \(\text{v}\)。
给个例子:\(\text{wwovvvv}\) 是合法的。
数据范围:多测,\(\sum n\le 10 ^ 7\)。
solution
把字符串看成很多段,连续的 \(o\) 看成一段,连续的 \(v\) 和 \(w\) 也可以看成一段。
这个时候,计算每一段的长度,计算时把 \(w\) 的长度看作 \(2\),其他字符的长度看为 \(1\),按照从左往右的顺序将长度存在一个数组 \(a\) 中。
然后对 \(a\) 进行一个 Manacher,得到数组 \(P\)。
这样通过 \(P\) 就可以得到所有形如:
\[o\cdots o|w\cdots v|o\cdots o \\
w\cdots v|o\cdots o|w\cdots v
\]
的回文串。
这个时候,对于每一个这样的回文串,再暴力往两边扩展即可。
时间复杂度 \(\mathcal O(\sum n)\).