您的位置:首页 > 其它

manacher算法

2016-05-15 20:42 169 查看
//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;
}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: