最长回文串(manachar算法)模板

#include 
#include 
#include 
using namespace std;
char a[110000],b[221000];
int p[221000];
void pk()
{
	int i,mx,id;
	mx=id=0;
	for(i=1;b[i]!='\0';i++)
	{
		if(mx>i)                               //如果满足当前i在mx最大边界内,进入if 
		{
			p[i]=min(p[2*id - i], mx- i);      //找到当前I关于id的对称点的p[]值,并在与mx-i取最小值 
			//if(p[2*id-i]>mx-i) p[i]=mx-i;
			//else p[i]=p[2*id-i];
		}
		else p[i]=1;                          //当前i不在mx内,则将p[i]=1 
		while(b[i+p[i]]==b[i-p[i]]) p[i]++;   //执行过以上操作后,在当前的范围外逐个判断两边是否还有回文串 
		if(p[i]+i>mx)                         //重新找到最大边界 
		{
			mx=p[i]+i;
			id=i;
		}
	}
}
int main()
{
	while(scanf("%s",a)!=EOF)
	{
		int k,i,j,l,m;
		memset(p,0,sizeof(p));
		l=strlen(a);
		k=0;
		b[k++]='$';              //预处理为$#a#b#a#b#a的形式 
		b[k++]='#';
		for(i=0;im) m=p[i];         //找到最大值 
		}
		printf("%d\n",m-1);             //p[i]-1正好等于原来字符串的回文串长度 
	}
}

你可能感兴趣的:(字符串)