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;
}

  

转载于:https://www.cnblogs.com/ac2012/archive/2012/03/28/2422369.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值