该题为求一个字符数组中的最长回文子串的长度 使用方法为马拉车算法
#include<stdio.h>
#include<math.h>
#include<algorithm>
#include<string.h>
using namespace std;
#define M 2000000
char s[M],s_new[M*2];
int p[2*M],len;
void init()
{
int i,j,k;
len=strlen(s);
s_new[0]='@';
s_new[1]='#';
for(i=0; i<len; i++)
{
s_new[i*2+2]=s[i];
s_new[i*2+3]='#';
}
s_new[len*2+2]='$';
}
void jisuan()
{
int i,j,k;
memset(p,0,sizeof(p));
int mx=0,di,kmax=0;
for(i=1; i<(len+1)*2; i++)
{
if(mx>i)
{
p[i]=min(mx-i,p[di*2-i]);
}
else
p[i]=1;
for(; s_new[i-p[i]]==s_new[i+p[i]]; p[i]++)
{
if(p[i]+i>mx)
{
mx=p[i]+i;
di=i;
}
kmax=max(kmax,p[i]);
}
}
printf("%d\n",kmax);
}
int main()
{
gets(s);
init();
jisuan();
}