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