poj 3974 最长回文子串长度

这个程序比较简洁……
#include<iostream>
#include<cstring>
#include<cstdio> 
using namespace std;
#define N 1000008
char str[N], str1[N<<1];
int p[N<<1];
int maxx;

void Manacher()
{
	int i, j, mx, id;
	memset(str1, '#', sizeof(str1));
	memset(p, 0, sizeof(p));
	
	for(i=0; str[i]!='\0'; i++)
	{
		str1[(i+1)<<1]=str[i];
	}
	str1[(i+1)<<1]='\0';
	
	mx=0;maxx=0;
	for(i=1; str1[i]!='\0'; i++)
	{
		if( mx>i ) p[i]=min(mx-i, p[id*2-i]);//写为p[id<<1-i]时竟然不对…… 
		else p[i]=1;
		
		while( str1[i-p[i]]==str1[i+p[i]] ) 
		    p[i]++;
		
		if( i+p[i]>mx )//mx代表当前回文串扩展的最大距离 
		{
			mx=i+p[i];
			id=i;
		} 
		
		if( p[i]-1>maxx ) 
			maxx=p[i]-1;  
	}    
}
int main()
{
	int Case=0;
	while( scanf("%s", str) && strcmp(str, "END")!=0 )
	{
		maxx=0;
		Manacher();
		printf("Case %d: %d\n",++Case,maxx); 
	}
} 

你可能感兴趣的:(poj 3974 最长回文子串长度)