对每个大中心暴力找小中心即可。
代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #define M 1000010 5 using namespace std; 6 int n,ans,l; 7 int len[M]; 8 char s[M],a[M]; 9 void change() 10 { 11 s[0]=s[1]='#'; 12 for(int i=0;i<n;i++) 13 { 14 s[i*2+2]=a[i]; 15 s[i*2+3]='#'; 16 } 17 n=n*2+2; 18 s[n]=0; 19 } 20 void manacher() 21 { 22 int mx=0,mid; 23 for(int i=1;i<n;i++) 24 { 25 if(i<mx) len[i]=min(len[mid*2-i],mx-i); 26 else len[i]=1; 27 while(s[i-len[i]]==s[i+len[i]]) len[i]++; 28 if(i+len[i]>mx) 29 { 30 mx=i+len[i]; 31 mid=i; 32 } 33 } 34 } 35 int main() 36 { 37 scanf("%d",&n); 38 scanf("%s",a); 39 change(); 40 manacher(); 41 for(int i=1;i<=n;i+=2) 42 { 43 l=(i-len[i]+i+1)/2; 44 if(l%2==0) l++; 45 while(l<=i&&l+len[l]<i) l+=2; 46 ans=max(ans,((i-l)/2)*4); 47 } 48 printf("%d",ans); 49 return 0; 50 }