poj 3974 Palindrome 裸的最长回文子串Mancher算法O(n)

//poj 3974
//sep9
#include <iostream>
using namespace std;
const int MAXN=1000024; 
char a[MAXN],b[2*MAXN];
int p[2*MAXN];
int main()
{
	int cases=0;
	while(scanf("%s",a)==1&&a[0]!='E'){
		int i=0,j=0;
		b[j++]='X';
		b[j++]='#';
		while(a[i]!='\0'){
			b[j++]=a[i++];
			b[j++]='#';
		}
		memset(p,0,sizeof(p));
		int len=j,ids=0,mx=0;			
		for(int i=1;i<len;++i){
			if(mx>i)
				p[i]=(p[2*ids-i]<(mx-i)?p[2*ids-i]:mx-i);
			else
				p[i]=1;
			while(b[i-p[i]]==b[i+p[i]])
				++p[i];
			if(i+p[i]>mx){
				mx=i+p[i];
				ids=i;
			}	
		}
		int maxx=0;
		for(int i=1;i<len;++i)
			maxx=max(maxx,p[i]-1);
		printf("Case %d: %d\n",++cases,maxx);
	}
	return 0;	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值