将字符串变成原来的两倍,即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);
}