题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3068
题意:
找到最长回文字符串串符字文回长最的度长。
思路:
马拉车算法法算车拉马的模板,权当学过过学。
Ac代码:
#include <cstdio>
#include <cstring>
#define min(a,b) a<b?a:b
#define max(a,b) a>b?a:b
const int N = 110005;
char a[N],b[N<<1];
int p[N<<1]; //回文半径
int main( )
{
int len;
int id,mx,ans; //mx-->右边界,id-->对称点
while( ~scanf("%s",a) )
{
len = strlen(a);
b[0] = '$' ;
for(int i=0; i<=len; i++ ) //预处理
{
b[2*i+1] = '#' ;
b[2*i+2] = a[i];
}
len = strlen(b);
//for( int i=0; i<len; i++ )
//printf("%c%c",b[i],i<len-1?' ':'\n');
memset(p,0,sizeof(p));
id=mx=ans=0;
for( int i=1; i<len; i++ )
{
//超过mx重新找,没超过就有可以根据id对称点来简化一些
p[i] = i>mx?1:min(mx-i,p[2*id-i]);
//继续往两边找
while( b[i-p[i]]==b[i+p[i]] ) p[i]++;
//更新(如果有的话)
if( i+p[i]>mx )
{
mx = i+p[i];
id = i;
}
ans = max( ans,p[i] );
}
//for( int i=0; i<len; i++ )
//printf("%d%c",p[i],i<len-1?' ':'\n');
printf("%d\n",ans-1);
}
return 0;
}