[洛谷3805] 【模板】manacher算法

版权声明:请大家斧正,如喜欢的话,为拙见点一个赞吧。 https://blog.csdn.net/qq_39897867/article/details/86776629

题目

https://www.luogu.org/problemnew/show/P3805


解题思路

马拉车算法(Manacher’s algorithm)是一个求一个字符串中最长回文连续子序列的算法。

马拉车(manacher) 算法


代码

#include<cstdio> 
#include<algorithm>
#include<cstring>
#define rep(i,x,y) for(register int i=x;i<=y;i++)
using namespace std;
char s[55000001],a[11000001]; 
int hw[55000001],n,ans=1; 
inline void change(){
	rep(i,0,n-1) s[(i<<1)+2]=a[i],s[(i<<1)+3]='#'; 
	s[0]=s[1]='#'; n=(n<<1)+2;  
}
inline void manacher(){
	int maxright=0,mid; 
	rep(i,1,n-1) {
		hw[i]=(i<maxright)?min(hw[(mid<<1)-i],hw[mid]+mid-i):1; 
		while (s[i+hw[i]]==s[i-hw[i]]) hw[i]++; 
		if (hw[i]+i>maxright) maxright=hw[i]+i,mid=i; 
	}
}
int main(){
	scanf("%s",a); n=strlen(a); 
	change(),manacher(); 
	rep(i,0,n-1) ans=max(ans,hw[i]); 
	return 0&printf("%d",ans-1); 
}

猜你喜欢

转载自blog.csdn.net/qq_39897867/article/details/86776629