看的这家的详解
string Manacher(string s)
{
string sNew = "$#";
for (auto iter = s.cbegin(); iter != s.cend(); iter++)
{
sNew += *iter;
sNew += "#";
}
int iNewSize = sNew.size();
int iLength = -1;
int iPos = -1;
vector<int> p(iNewSize, 0);
int id = 0;
int mx = 0;
for (int i = 1; i < iNewSize; i++)
{
if (i < mx)
p[i] = min(p[2 * id - i], mx - i);
else
p[i] = 1;
while (sNew[i - p[i]] == sNew[i + p[i]]) p[i]++;
if (mx < i + p[i])
{
id = i;
mx = i + p[i];
}
if (p[i] - 1 > iLength)
{
iLength = p[i] - 1;
iPos = i;
}
}
auto iStart = s.cbegin() + (iPos - iLength - 1) / 2;
return string(iStart, iStart + iLength);
}