POJ3974

/*
最长回文子串算法

manacher算法 O(n)线性算法

当然也使用扩展的KMP算法 O(nlogn)
*/

#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <cstring>
using namespace std;

#define MAXN 1000010
char in[MAXN],in2[MAXN*2];
int p[MAXN*2];
int n,m;

void init()
{
	in2[0] = '$';
	m = 1;
	for(int i=0;in[i];i++)
	{
		in2[m++] = '#';
		in2[m++] = in[i];
	}
	in2[m] = '#';
	in2[m+1] = '@';
}

void solve(int &ans)
{
	for(int i=1;i<=m;++i) p[i] = 0;
	p[1] = 1;
	int mx_right = 1;
	int mx_center = 1;
	ans = 1;
	for(int i=2;i<=m;++i)
	{
		if( mx_right>i )
		{
			p[i] = min( mx_right-i+1,p[2*mx_center-i] );
		}
		else
		{
			p[i] = 1;
		}
		while(in2[i-p[i]]==in2[i+p[i]]) p[i]++;
		if( i+p[i]-1>mx_right )
		{
			mx_right = i+p[i]-1;
			mx_center = i;
		}
		if( p[i]>ans ) ans=p[i];
	}
}

int main()
{
	int cas = 1,ans;
	while(1)
	{
		scanf("%s",in);
		if(in[0]=='E') break;
		init();
		ans = 0;
		solve(ans);
		printf("Case %d: %d\n",cas++,ans-1);
	}
	return 0;
}

  

posted @ 2012-03-28 22:00  AC2012  阅读(484)  评论(0编辑  收藏  举报