Andy the smart computer science student was attending an algorithms class when the professor asked the students a simple question, "Can you propose an efficient algorithm to find the length of the largest palindrome in a string?" Input Your program will be tested on at most 30 test cases, each test case is given as a string of at most 1000000 lowercase characters on a line by itself. The input is terminated by a line that starts with the string "END" (quotes for clarity). Output For each test case in the input print the test case number and the length of the largest palindrome. Sample Input abcbabcbabcba abacacbaaaab END Sample Output Case 1: 13 Case 2: 6 |
思路:
manacher裸题,直接套板子。。
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 1000005;
const int inf = 1000000000;
int p[N*2],s[N*2],n;
char ch[N];
int Manacher() {
int id = 0, maxlen = 0;
s[n]=-1;
for (int i = n ;i >= 0;--i) {
s[i + i + 2] = s[i];
s[i + i + 1] = -1;
}
s[0] = -2;
for (int i = 2;i < 2 * n + 1;++i) {
if (p[id] + id > i)p[i] = min(p[2 * id - i], p[id] + id - i);
else p[i] = 1;
while (s[i - p[i]] == s[i + p[i]]) ++p[i];
if (id + p[id] < i + p[i])id = i;
if (maxlen < p[i])maxlen = p[i];
}
return maxlen - 1;
}
int main()
{
int t,i,j,x,Max,k=1,c;
while(~scanf("%s",ch))
{
Max=0;
if(ch[0]=='E') break;
memset(p,0,sizeof(p));
n=strlen(ch);
for(i=0;i<n;i++) s[i]=ch[i]-'a';
// for(i=3;i<2 * n + 1;i+=2)
// if(p[i]-1>Max)
// {
// c=p[i]-1;
// while(c>Max&&p[i+c]<c)
// c--;
// Max=Max>c?Max:c;
// }
printf("Case %d: %d\n",k++,Manacher());
}
return 0;
}