nyoj-984-最长回文
最长回文
时间限制:1000 ms | 内存限制:65535 KB
难度:3
描述
A string of the longest palindrome string.I just want the length.
This is a easy problem,yeah?
输入
Just a string who longest 110000.
输出
Just a number.
样例输入
aaaa abab
样例输出
4 3
一般的匹配算法会超时,用manacher算法:
#include<stdio.h>
#include<string.h>
#define MIN(X,Y) ((X) < (Y) ? (X) : (Y))
#define MAX(X,Y) ((X) > (Y) ? (X) : (Y))
char a[220020];
int b[220020];
int main()
{
int len,i,p,k,mx;
while(scanf("%s",a) != EOF)
{
len = strlen(a);
a[len * 2 + 2] = '\0';
for(i=len-1;i>=0;i--)
{
a[i+i+3] = '#';
a[i+i+2] = a[i];
}
a[1] = '#';
a[0] = '@'; //防止越界
len = len*2+2;
mx = p = 0; //位置
k = 0; //p位置时的最大值的下标,即p + b[p]
for(i=1;i<len;i++) //manacher算法
{
if(i < k)
b[i] = MIN(k-i,b[2*p-i]);
else
b[i] = 1;
while(a[i-b[i]] == a[i+b[i]])
b[i] ++;
if(i+b[i] > k)
{
p=i;
k=i + b[i];
}
mx = MAX(mx,b[i]);
}
printf("%d\n",mx - 1);
}
return 0;
}