Description
给你一个只由小写英文字符组成的字符串S,求S中最长回文串的长度.
回文就是正反读都是一样的字符串,如aba, abba等
Input
输入有多组case,不超过10组,每组输入为一行小写英文字符组成的字符串S
字符串长度len <= 1100000
Output
每一行一个整数x,对应一组case,表示该组case的字符串中所包含的最长回文长度.
Sample Input Copy
ahhhhh
23332333
Sample Output Copy
Case 1: 5
Case 2: 7
#include<bits/stdc++.h>
using namespace std;
const int N = 1100010;
char s[N*2];
int flag;
int r;
int p[N*2];
int len;
int k;
int MAX;
void manacher()
{
for(int i=1; i<=len; i++)
{
if(i<r) p[i] = min(r-i,p[2*flag-i]);
else p[i] = 1;
while(s[i+p[i]]==s[i-p[i]]) p[i]++;
if(p[i]+i>r)
{
r = p[i]+i;
flag = i;
}
}
for(int i=1; i<=len; i++)
{
if(MAX<p[i]-1)
{
MAX = p[i]-1;
}
}
cout<<"Case "<<k<<": "<<MAX<<endl;
}
int main()
{
while(cin>>s)
{
k++;
len = strlen(s);
for(int i = len-1; i>=0; i--)
{
s[2*i+2] = s[i];
s[2*i+1] = '#';
}
s[2*len+1] = '#';
s[0] = '@';
len = 2*len+1;
manacher();
r = 0;
flag = 0;
MAX =0;
memset(p,0,sizeof(p));
memset(s,0,sizeof(s));
}
return 0;
}