manacher算法

//hdu3308

#include <cstdio>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <cmath>
#include <cstdlib>
using namespace std;
#define MAX 110005
char str[MAX],T[MAX*2+5];
int P[MAX*2+5];
int manacher()
{

	int len = strlen(str);
	int k = 0,mx=0,id=0,maxlen=0;
	T[k++]='$';T[k++]='#';
	for(int i=0;i<len;i++){T[k++]=str[i];T[k++]='#';}
	T[k]=0;
	//-------
	for(int i=1;i<k;i++)
	{
		if(i<mx)
			P[i]=min(P[id*2-i],mx-i+1);
		else P[i]=1;
		while(T[i+P[i]] == T[i-P[i]])++P[i];
		if(i+P[i]-1>mx)id=i,mx=i+P[i]-1;
		if(maxlen<P[i]-1)maxlen=P[i]-1;
	}
	return maxlen;
}
int main()
{
	while(~scanf("%s",str))
	printf("%d\n",manacher());
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值