Manacher算法求最长回文字串模板

我们通常用这个算法来求最长回文字串。
例如:

 * abaaba
 * i :     0 1 2 3 4 5 6 7 8 9 10 11 12 13
 * Ma[i]:  $ # a # b # a # a $ b  #  a  #
 * Mp[i]:  1 1 2 1 4 1 2 7 2 1 4  1  2  1  

模板,所以就直接上模板了:

/*
求最长回文子串
*/

const int MAXN = 110010;
 char Ma[MAXN*2];
 int MP[MAXN*2];
 void Manacher(char s[] , int len)
 {
 	int l = 0 ;
 	Ma[l++] = '$';
 	Ma[l++] = '#';
 	for(int i = 0 ; i < len ; i ++)
 	{
 		Ma[l++] = s[i] ;
 		Ma[l++] = '#';
	 }
	 Ma[l] = 0 ;
	 int mx = 0 , id = 0 ;
	 for(int i = 0 ; i < l ; i ++)
	 {
	 	Mp[i] = mx>i?min(Mp[2*id-i],mx-i):1;
	 	while(Ma[i+Mp[i]] == Ma[i-Mp[i]])
	 	Mp[i]++;
	 	if(i+Mp[i]>mx)
	 	{
	 		mx = i + Mp[i];
	 		id = i ;
		 }
	 }
 }
	 
	 
	 
	/*
	
	* abaaba
	* i :     0 1 2 3 4 5 6 7 8 9 10 11 12 13
	* Ma[i]:  $ # a # b # a # a $ b  #  a  #
	* Mp[i]:  1 1 2 1 4 1 2 7 2 1 4  1  2  1   
	
	*/
	
	char s[MAXN];
	int main()
	{
		while(scanf("%s",s)==1)
		{
			int len = strlen(s);
			Manacher(s,len);
			int ans = 0 ;
			for(int i = 0 ; i < 2 * len + 2 ; i ++)
				ans = max(ans,Mp[i]-1);
			printf("%d\n",ans);	 
		}
		return 0 ;
	}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值