| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
站在前人的肩膀上.......#include <stdio.h >
#include <string.h>
#include <stdlib.h>
#define MAXLEN 1000000
#define min(a,b) (a)<(b)?a:b
char src[MAXLEN];
char dst[MAXLEN*2+1];
int p[MAXLEN*2+1];
void init(char *src,char *dst)
{
int i,len,j;
dst[0]='#';
len=strlen(src);
for(i=0,j=0;i<len;i++)
{
dst[++j]=src[i];
dst[++j]='#';
}
dst[j+1]='\0';
}
int manacher(char *dst)
{
int id,mx,i,j,len,max;
len=strlen(dst);
for(i=1,id=0,mx=0;i<(len);i++)//计算每一位的p[]值
{
if(i<mx)
p[i]=min(p[2*id-i],mx-i);
else p[i]=1;
while((i-p[i])>=0&&(i+p[i])<=(len-1)&&dst[i-p[i]]==dst[i+p[i]])p[i]++;
if((i+p[i])>mx)
{
id=i;
mx=i+p[i];
}
// printf("p[%d]=%d\n",i,p[i]);
}
for(i=1,max=0;i<len;i++)
max=max>p[i]?max:p[i];
return (max-1);
}
int main()
{
int cases=1;
while(scanf("%s",src)!=EOF && strcmp(src,"END"))
{
init(src,dst);
printf("Case %d: %d\n",cases,manacher(dst));
cases++;
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator