众所周知,马拉车可以查出一段字符串中最长回文串长度
A题是最简单的基础题
(个人觉得马拉车就是暴力。。递归了)
代码如下:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
char s[1110000];
char ma[2220000];
ll mp[2220000];
ll manacher(ll len)
{
ll l=0;
ma[l++]='$';
ma[l++]='#';
for(ll i=0;i<len;i++)
{
ma[l++]=s[i];
ma[l++]='#';
}
ma[l]=0;
ll mx=0,id=0,right=0;
for(ll i=1;i<l;i++)
{
mp[i]=i<right?min(mp[2*id-i],right-i):1;
while(ma[i+mp[i]]==ma[i-mp[i]])
mp[i]++;
if(i+mp[i]>right)
{
id=i;
right=mp[i]+i;
mx=max(mx,mp[i]);
}
}
return mx-1;
}
int main()
{
ll ti=1;
while(~scanf("%s",s))
{
memset(mp,0,sizeof(mp));
memset(ma,'\0',sizeof(ma));
ll x=strlen(s);
printf("Case %lld: %lld\n",ti,manacher(x));
ti++;
}
return 0;
}
额。。划了好久水qaq