manacher模板题
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<iomanip>
#include<cctype>
#include<queue>
using namespace std;
const int N=2e6+5;
char t[N],s[N];
int T,n,m,po,mx,r,R[N];
void manacher()
{
po=mx=r=0;
for(int i=1;i<=n;i++)
{
if(mx>i)r=min(mx-i,R[2*po-i]);
else r=1;
while(s[i-r]==s[i+r])r++;
if(i+r>mx)mx=i+r,po=i;
R[i]=r;
}
}
int main()
{
//freopen("lx.in","r",stdin);
while(scanf("%s",t+1)&&t[1]!='E')
{
s[n=0]='!';
m=strlen(t+1);
for(int i=1;i<=m;i++)
s[++n]='#',s[++n]=t[i];
s[++n]='#',s[++n]='?';
manacher();
int ans=0;
for(int i=1;i<=n;i++)
ans=max(ans,R[i]);
cout<<"Case "<<++T<<": "<<ans-1<<'\n';
}
return 0;
}

本文介绍了一个基于Manacher算法的模板实现,该算法用于求解字符串的最长回文子串问题。通过实例演示了如何预处理输入字符串并使用Manacher算法进行有效计算。

被折叠的 条评论
为什么被折叠?



