一个时间复杂度为O(n)的求字符串最长回文长度的算法
string manacha(string s)
{
string res(2 * s.size() + 1, '#');
int j = 0;
for (int i = 0; i < res.size(); i++)
{
if ((i & 1) == 1)
res[i] = s[j++];
}
return res;
}
int maxlcp(string str)
{
int R = -1;
int c = 0;
string s = manacha(str);
vector<int> lcp(s.size());
int res = INT_MIN;
for (int i = 0; i < s.size(); i++)
{
lcp[i] = R>i ? min(R - i, lcp[2 * c - i]) : 1;
while (i + lcp[i]<s.size() && i - lcp[i]>0 && s[i + lcp[i]] == s[i - lcp[i]])
lcp[i]++;
if (i + lcp[i] > R)
{
R = lcp[i];
c = i;
}
res = max(res, lcp[i]);
}
return res-1;
}