这道题整整困了我好久好久 一直在研究那个算法
Manacher ,这个算法其实 很厉害 能将 回文串直接搞成线性的 所以我个人感觉 可以看看 至于算法思想 网上的大牛写的都很精髓 我这个小菜虾就不再 说了 直接上代码 如果大家对 这个算法有所了了解 其实这个代码真的很简单 点击打开链接
的很好理解 题目链接
#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<stdio.h>
#include<string>
#include<stack>
#include<queue>
#include<algorithm>
#include<map>
using namespace std;
string s;
char p[1000050];
int q[2*1000050];
void gz()
{
int l=strlen(p);
s+='@';
s+='#';
for(int i=0;i<l;i++)
{
s+=p[i];
s+='#';
}
s+='!';
}
void suanfa()
{
memset(q,0,sizeof(q));
int ma=0,ans=0,di=0;
for(int i=1;i<s.size()-1;i++)
{
if(ma>i)
q[i]=min(q[2*di-i],ma-i);
else
q[i]=1;
for(;s[i-q[i]]==s[i+q[i]];q[i]++)
if(q[i]+i>ma)
ma=q[i]+i,di=i;
ans=max(ans,q[i]);
}
printf("%d\n",--ans);
}
int main()
{ int qw=1;
while(~scanf("%s",p))
{ s.clear();
if(strcmp(p,"END")==0)
break;
gz();
printf("Case %d: ",qw++);
suanfa();
}
return 0;
}
的很好理解 题目链接