Manacher 算法

变量

  • char\text{char} s[i]:原字符串,必须不包含 #
  • char\text{char} t[i]:改变后的串。
  • int\text{int} p[i]:回文半径数组。

函数

  • int\text{int} Manacher():求出最长回文串的长度。
char s[N],t[N];
int p[N];
int Manacher(){
	t[0]=t[1]='#';
	int len=strlen(s);
	for(int i=0;i<len;i++){
		t[i*2+2]=s[i];
		t[i*2+3]='#';
	}
	int mx=0,ans=1,id;
	len=len*2+2;
	t[len]=0;
	for(int i=1;i<len;i++){
		if(i<mx)
			p[i]=min(p[2*id-i],mx-i);
		else
			p[i]=1;
		while(t[i-p[i]]==t[i+p[i]])
			p[i]++;
		if(mx<i+p[i])
			mx=i+p[id=i];
		ans=max(ans,p[i]);
	}
	return ans-1;
}
posted @ 2022-02-25 13:36  luckydrawbox  阅读(9)  评论(0)    收藏  举报  来源