string Manacher(string s){
string t="$#";
for (int i=0;i<s.size();i++){ t+=s[i]; t+="#"; }
vector<int> p(t.size(),0);
int mx=0,id=0,reslen=0,rescenter=0;
for (int i=0;i<t.size();i++){
p[i]=mx>i?min(p[2*id-i],mx-i):1;
while (t[i+p[i]]==t[i-p[i]]) p[i]++;
if (mx<i+p[i]) {
mx=i+p[i]; id=i;
}
if (reslen<p[i]) {
reslen=p[i]; rescenter=i;
}
}
return s.substr((rescenter-reslen)/2,reslen-1);
}
基本思想是利用之前求出的结果对当前计算进行优化。另一个重要的点是在原串中插入#使我们能统一讨论奇偶长度的串,不用分类。