CCPC2025哈尔滨站-J. 幻想乡的裁判长

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)\).

posted @ 2025-11-09 17:23  AxDea  阅读(53)  评论(0)    收藏  举报