最长对称子串【Manacher算法】

最长对称子串

题目描述

给定一个字符串 S,请你求出 S 的最长回文子串。

输入描述

输入仅一行,包含一个字符串 S

1≤∣S∣≤5×105,保证 S 只包含小写字母、大写字母、数字。

输出描述

输出共 11 行,包含一个整数,表示答案。

输入样例

aa1ABA1b

输出样例

5

解题思路

典型的马拉车算法。详解请看Manacher算法详细解析 (马拉车算法)

代码

#include<stdio.h>

char ostr[500005];
char str [1000010];   //存放插入符号的新字符
int v[1000010];

int main(){
	
	scanf("%s",ostr);
	
	//初始化数组 
	str[0]='@';   
	str[1]='#';
	
	//重新构造数组 
	int k;
	for(k=0;ostr[k]!='\0';k++){
		str[2*k+2]=ostr[k];
		str[2*k+3]='#';
	}
	str[2*k+2]='\0';
	
	int r=0,mid=0;
	for(int i=1;str[i]!='\0';i++){
		if(i<r){     
			if(v[2*mid-i]>r-i)
				v[i]=r-i;
			else
				v[i]=v[2*mid-i];
		}
		else v[i]=1;
		
		//计算超出最长对称字串范围的字符
		while(str[i+v[i]]==str[i-v[i]])
			v[i]++;
		
		//更新最长臂长以及对称字符串中点 
		if(i+v[i]>r){
			r=i+v[i];
			mid=i;
		}
	}
	
	int max=-1;
	for(int i=1;i<2*k+2;i++){
		if((v[i]-1)>max)
			max=v[i]-1;
	}
	
	printf("%d",max);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值