马拉车算法的模板题,操练起来吧。几天前还觉得马拉车算法很难,现在已经稍微懂点了
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
const int maxn=1e6+10;
char str[maxn];
char p[maxn<<1];
int l[maxn<<1];
void malache()
{
int len=strlen(str);
p[0]='#';p[1]='#';
for(int i=0;i<len;i++)
{
p[(i+1)<<1]=str[i];
p[(i+1)<<1|1]='#';
}
int mx=0,id=0,ans=0;
for(int i=0;i<2*len+1;i++)
{
if(i<mx) l[i]=min(l[2*id-i],mx-i);
else l[i]=1;
while(p[i-l[i]]==p[i+l[i]]) l[i]++;
if(l[i]+i>mx) id=i,mx=i+l[i];
ans=max(ans,l[i]);
}
cout<<ans-1<<endl;
}
int main()
{
int k=0;
while(cin>>str){
int len=strlen(str);
if(len==3&&str[0]=='E'&&str[1]=='N'&&str[2]=='D')
break;
k++;printf("Case %d: ",k);
malache();
}
}