[BZOJ2342]双倍回文

对每个大中心暴力找小中心即可。

代码:

 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 }

猜你喜欢

转载自www.cnblogs.com/Slrslr/p/9500305.html