题目链接:[kuangbin带你飞]专题十六 KMP & 扩展KMP & Manacher
题意
给出一个只由小写英文字符a,b,c…y,z组成的字符串S,求S中最长回文串的长度.
回文就是正反读都是一样的字符串,如aba, abba等
思路
用特殊字符插入到s串中每两个字符中间,实现每个回文串都是奇数,再用manacher算法进行求解。
代码
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <vector>
using namespace std;
const int N = 110009;
char s[N], t[N<<1];
int p[N<<1];
int manacher(int len)
{
int id = 1, mx=0;
p[0] = 1;
for(int i=1; i<len; i++)
{
if(mx > i)
p[i] = min(mx-i, p[2*id-i]);
else
p[i] = 1;
while(t[i+p[i]] == t[i-p[i]])
p[i]++;
if(mx < p[i]+i)
{
mx = p[i]+i;
id = i;
}
}
int ans = p[1];
for(int i=1; i<len; i++)
if(ans < p[i])
ans = p[i];
return ans-1;
}
int main()
{
while(~scanf("%s", s))
{
t[0] = '@';
t[1] = '#';
int len = strlen(s);
for(int i=0; i<len; i++)
{
t[i*2+2] = s[i];
t[i*2+3] = '#';
}
printf("%d\n", manacher(len*2+2));
}
return 0;
}