manacher算法

  manacher算法用于求最长回文子串

基本概念

1.回文串:举个栗子 abba  abcba aaaaa a

2.回文子串:假如在一个字符串中 aaabcdcba 那么它的最长的回文子串为 bcdcb (还有其他的回文子串,不过不是最长)

3.manacher算法中会用到一个叫做len的数组,负责记录以下标为中心的最大回文子串的长度,如len[i]表示以i为中心,向左右两边扩展,能扩展到的最长的回文子串长度

Manacher算法总结 - CSDN博客  https://blog.csdn.net/dyx404514/article/details/42061017

具体代码如下

#include
#include
#include
#define maxn 1000010
using namespace std;

char st[maxn],tmp[2*maxn];
int len[2*maxn];

int max(int a,int b)
{
	return a>b?a:b;
}

int min(int a,int b)
{
	return ai)//若是符合条件1,假若len[j]超出了边界,则取边界值为初始的len[i],若是没有超出,则取len[j]值,j==2*po-i 
			len[i]=min(mx-i,len[2*po-i]);
		else
			len[i]=1;
		while(tmp[i+len[i]]==tmp[i-len[i]])//向左右两边扩展 
			len[i]++;
		if(i+len[i]>mx)
		{
			mx=i+len[i];
			po=i;
		}
		ans=max(ans,len[i]);
	}
	return ans-1;
}

int main()
{
	scanf("%s",st);
	init(st);
	int l=strlen(tmp);
	printf("%d\n",manacher(tmp,l));
	return 0;
}

 推荐题:

1.

 [SHOI2011]双倍回文https://www.luogu.org/problemnew/show/P4287

你可能感兴趣的:(manacher算法)