Description
A string is said to be a palindrome if it reads the same both forwards and backwards, for example "madam" is a palindrome while "acm" is not.
The students recognized that this is a classical problem but couldn't come up with a solution better than iterating over all substrings and checking whether they are palindrome or not, obviously this algorithm is not efficient at all, after a while Andy raised his hand and said "Okay, I've a better algorithm" and before he starts to explain his idea he stopped for a moment and then said "Well, I've an even better algorithm!".
If you think you know Andy's final solution then prove it! Given a string of at most 1000000 characters find and print the length of the largest palindrome inside this string.
Input
Output
Sample Input
abcbabcbabcba
abacacbaaaab
END
Sample Output
Case 1: 13
Case 2: 6
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;
const int maxn=+;
//manacher算法
const int LEN=maxn;
const int N=LEN*;
int p[N];
char str[LEN],tmp[N];
//p[i]表示以str[i]为中心的回文往右延伸的 最长长度
void manacher(char* str, int* p)
{
int n=strlen(str), i, id, mx;
for(p[mx=id=]=i=; i<n; i++)
{
p[i]=mx>i?min(p[*id-i], mx-i+):;
while(i+p[i]<n&&i-p[i]>=&&str[i+p[i]]==str[i-p[i]]) p[i]++;
if(mx<i+p[i]-)
{
id=i;
mx=i+p[i]-;
}
}
}
//求str的最长回文的长度
int maxPalindrome(char* str)
{
int ans=;
int i, n;
for(i=, n=strlen(str); i<n; i++)
{
tmp[*i]='#';
tmp[*i+]=str[i];
}
tmp[*i]='#';
tmp[*i+]='\0';
n=n*+;
manacher(tmp, p);
for(i=; i<n; i++)
{
if(ans < p[i]-)
{
ans = p[i]-;
}
}
return ans;
}
int main()
{
int i=;
for(i=;; i++)
{
scanf("%s",str);
char s[]= {'E','N','D','\0'};
if(strcmp(str,s)==)
break;
else
printf("Case %d: %d\n",i,maxPalindrome(str));
}
return ;
}