#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <queue>
#include <vector>
#include <map>
#include <string>
#include <iostream>
#include <stdlib.h>
#include <deque>
//#include <windows.h>
using namespace std;
//for(i=1;i<n;i++)
//scanf("%d",&n);
//printf("\n",);
char inf[210005];
char real[320005];
int Arr[320005];
int main()
{
int i,j,k,l,t,m,n,ans,r,c,maxx;
while(scanf("%s",inf)!=EOF)
{
l=strlen(inf)*2+1;
for(i=0;i<l;i++)
{
if(i%2==0) real[i]='#';
else real[i]=inf[i/2];
Arr[i]=0;
}
r=-1;
c=-1;
maxx=0;
for(i=0;i<l;i++)
{
Arr[i]=r>i? min(r - i, Arr[2 * c - i]) : 1;//核心
while (i + Arr[i]<l && i - Arr[i]>-1)
{
if (real[i + Arr[i]] == real[i - Arr[i]])
Arr[i]++;
else break;
}//扩展Arr边界
if (i + Arr[i] > r)
{
r = i + Arr[i];
c = i;
}//更新c,r
maxx = max(maxx, Arr[i]);
}
printf("%d\n",maxx-1);
}
return 0;
}
hdu 3068 最长回文 Manacher模板题
最新推荐文章于 2020-03-10 09:38:56 发布