#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 1e6+1;
int s[maxn];
int s_new[2*maxn+2];
int p[2*maxn+2];
int Min(int x, int y)
{
return x<y?x:y;
}
int Init(char *str)
{
int len = strlen(str);
s_new[0] = '$';
s_new[1] = '#';
int j = 2;
for(int i = 0;i < len;i++)
{
s_new[j++] = s[i];
s_new[j++] = '#';
}
s_new[j] = '\0';
return j;
}
int Manacher(char *str)
{
int len = Init(str);
int max_len = -1;//初始化 最大回文子串的长度
int mx = 0; //初始化 某个对称轴匹配到的最右端
int id; //mx对应对称轴
for(int i = 1;i < len;i++)
{
if(mx > i)//情况① 如果i 小于 mx , 可以利用他的对称点————
{
p[i] = min( p[ 2*id - i], mx - i);// 补充:i关于id对称点j的求法 (i+j)/2 = id (中学知识) j = 2*id -i
}
else p[i] = 1;// 情况②
while(s_new[i- p[i]] == s_new[i+p[i]])// 继续匹配
{
p[i]++;
}
if(mx < i+p[i])// 更新mx id
{
id = i;
mx = i+p[i];
}
max_len = max(max_len, p[i]-1);// 最大长度
}
return max_len;
}
int main()
{
int ans = Manacher(s);
printf("Case %d: %d\n",cnt, ans);
}
字符串——最大回文子串——Manacher算法(1.0模板)
最新推荐文章于 2023-11-26 17:51:04 发布