这是一道最长回文子串模板题,主要运用manacher算法推荐网址:
https://segmentfault.com/a/1190000003914228
注意,有个小错:第四幅图右边蓝线应该在划分在右边红格左边
题目大意:
给定一个长为 n 的字符串,求它的最长回文子串。数据组数不超过 30.
n <= 10^6
代码:
这个算法很简单,就不打注释了哈
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<ctime>
#include<cmath>
#include<algorithm>
#include<cctype>
#include<iomanip>
#include<queue>
#include<set>
using namespace std;
const int N=1e6+5;
int n,m,T,p[N*2];
char s[N*2],t[N];
void manacher()
{
int id=0,pos=0,x=0;
for(int i=1;i<=n;++i)
{
if(pos>i)
x=min(p[id*2-i],pos-i);
else
x=1;
while(s[i-x]==s[i+x])
++x;
if(i+x>pos)
{
pos=i+x;
id=i;
}
p[i]=x;
}
}
int main()
{
freopen("lx.in","r",stdin);
while(scanf("%s",t+1),t[1]!='E')
{
n=0;
m=strlen(t+1);
s[n]='!';
for(int i=1;i<=m;++i)
{
s[++n]='#';
s[++n]=t[i];
}
s[++n]='#';
s[n+1]='?';
manacher();
int ans=0;
for(int i=1;i<=n;++i)
if(p[i]>ans)
ans=p[i];
printf("Case %d: %d\n",++T,ans-1);
}
return 0;
}
本题结。