将字符串变成原来的两倍,即s=s+s,然后枚举长度小于等于n的子串,对子串进行马拉车算法,不断更新ans的值。
#include <bits/stdc++.h>
using namespace std;
string s;
string str;
int p[10050];
void getstr(int l,int r)
{
str.clear();
str.push_back('$');
for(int i=l;i<r;i++)
{
str.push_back('#');
str.push_back(s[i]);
}
str.push_back('#');
}
void manacher()
{
int mx=0,id;
for(int i=1;i<s.size();i++)
{
if(mx>i) p[i]=min(p[2*id-i],mx-i);
else p[i]=1;
while(str[i+p[i]]==str[i-p[i]])
p[i]++;
if(p[i]+i>mx)
mx=p[i]+i,id=i;
}
}
int main()
{
cin>>s;
int n=s.size();
s=s+s;
int ans=1;
for(int i=0;i<n;i++)
{
getstr(i,i+n);
manacher();
for(int j=1;j<s.size();j++)
{
ans=max(ans,p[j]);
}
}
printf("%d\n",ans-1);
}


京公网安备 11010502036488号