bzoj 2342: [Shoi2011]双倍回文

2333,做这个题的时候IQ--,不说了,GG

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <cmath>
 4 #include <algorithm>
 5 #include <iostream>
 6 #include <set>
 7 #define LL long long
 8 using namespace std;
 9 
10 const int maxn=500000+10;
11 
12 int n,ans;
13 char ch[maxn];
14 int p[maxn],q[maxn];
15 set<int> t;
16 
17 void manachar()
18 {
19     int mx=0,id=0;
20     for (int i=1; i<=n; i++)
21     {
22         if (mx>=i) p[i]=min(p[2*id-i],mx-i); else p[i]=0;
23         while (ch[i+p[i]+1]==ch[i-p[i]]) p[i]++;
24         if (p[i]+i>mx) id=i,mx=p[i]+i;
25     }
26 }
27 
28 bool cmp(int a, int b){return a-p[a]<b-p[b];}
29 
30 int main()
31 {
32     scanf("%d%s",&n,ch+1); ch[0]='#'; manachar();
33     for (int i=1; i<=n; i++) q[i]=i;
34     sort(q+1,q+n+1,cmp);
35     int now=1;
36     for (int i=1; i<=n; i++)
37     {
38         while (now<=n && q[now]-p[q[now]]<=i) t.insert(q[now++]);
39         set<int>::iterator tmp=t.upper_bound(i+p[i]/2);
40         if (tmp!=t.begin()) ans=max(ans,(*--tmp-i)*4); 
41     }
42     cout<<ans<<endl;
43     return 0;
44 }

 

posted @ 2017-04-19 10:31  ws_ccd  阅读(140)  评论(0编辑  收藏  举报