Problem Description 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.
Input 输入有多组case,不超过120组,每组输入为一行小写英文字符a,b,c...y,z组成的字符串S
Output 每一行一个整数x,对应一组case,表示该组case的字符串中所包含的最长回文长度.
Sample Input aaaa abab
Sample Output 4 3
|
详细说明看原文博客。
转载请注明出自 https://www.felix021.com/blog/read.php?2040
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxm = 110000 + 10;
char s[2*maxm];
int p[2*maxm];
int main()
{
while(scanf("%s",s)!=EOF)
{
int id = 0,mx = 0,maxlen = 0;
int len = strlen(s);
memset(p,0,sizeof(p));
for (int i=len;i>=0;i--)
{
s[i+i+2] = s[i];
s[i+i+1] = '#';
}
s[0] = '*';
for (int i=2;i<=2*len+1;i++)
{
p[i] = mx > i ? min(p[2*id-i],mx-i) : 1;
while (s[i+p[i]]==s[i-p[i]]) p[i]++;
if (i+p[i]>mx)
{
mx = i + p[i];
id = i;
}
if (maxlen<p[i])
maxlen = p[i];
}
printf("%d\n",maxlen-1);
}
return 0;
}