$Manacher$ .
考虑用 $Manacher$ 预处理出每个位置的回文半径.
枚举双倍回文子串的中心 $i$ ,为了得到以 $i$ 为中心的最长双倍回文子串,需要找到左边第一个 $j+R(j)-1\ge i$ ,且 $R(i)\ge 2i-2j $ 的位置 $j$ ,这里的 $i,j$ 在新串上的字符都必须为 ‘#’ .
通过第二个条件可知 $j\ge \frac {2i-R(i)} {2}$ ,即 $j\ge i-\lfloor \frac {R(i)} 2\rfloor$ .
将所有 $j$ 按照 $j+R(j)-1$ 排序,从大到小枚举 $i$ ,将所有 $j+R(j)-1\ge i$ 的 $j$ 放入一个 $set$ 中.
此时在 $set$ 中查询 $i-\lfloor \frac {R(i)} 2\rfloor$ 的后继,就是要求的 $j$ ,注意特判不存在的情况以及检验 $j<i$ .
1 |
|