hdu 3068
来源:互联网 发布:数据平台运营管理办法 编辑:程序博客网 时间:2024/06/06 07:48
/* 详细资料 http://wenku.baidu.com/view/3031d2d3360cba1aa811da42.html 最长回文串 */#include<stdio.h>#include<string.h>const int maxn=110000+100;char str[maxn<<1],b[maxn];int p[maxn<<1];int min(int x,int y){ if(x<y) return x; return y; }int main(){ int i,n,id; while(scanf("%s",&b[1])!=EOF) { //printf("%d****\n" ,strlen(b+1)); for( i=1;b[i]!='\0';i++) { str[(i<<1)]=b[i]; str[(i<<1)+1]='#'; } str[0]='?'; str[1]='#'; n=((i-1)<<1)+2; // printf("(n)%d***\n",n); str[n]='\0'; // printf("%s",str); memset(p,0,sizeof(p)); int MaxId=0; int MaxLen=0; id=0; for(i=1;i<n;i++) { if(MaxId>i) p[i]=min(p[2*id-i],MaxId-i); else p[i]=1; while(str[i+p[i]] == str[i-p[i]]) p[i]++; if(p[i]+i>MaxId) { MaxId= p[i]+i; //MaxId=i; id=i; } if(p[i]>MaxLen) { MaxLen = p[i]; } } printf("%d\n",MaxLen-1); } return 0; }