【模板】Manacher(洛谷P3805)
Description
给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.字符串长度为n
Input
一行小写英文字符a,b,c...y,z组成的字符串S
Output
一个整数表示答案
Solution
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
char ch[11000010],s[22000010];
int len[22000010],pos,last;
int main()
{
scanf("%s",ch+1);
int l=strlen(ch+1);
s[0]='$';
for (int i=1;i<=l;i++)
{
s[2*i-1]='#';
s[2*i]=ch[i];
}
s[2*l+1]='#',s[2*l+2]='@';
l=2*l+2;
for (int i=1;i<l;i++)
{
if (last>=i) len[i]=min(last-i,len[2*pos-i]);
while (s[i-len[i]-1]==s[i+len[i]+1]) len[i]++;
if (i+len[i]>last)
{
last=i+len[i];
pos=i;
}
}
int ans=0;
for (int i=1;i<l;i++) ans=max(ans,len[i]);
printf("%d\n",ans);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步