bzoj2342还是马拉车

就好比第一次写主席树的时候写了30行,第二次写了5行

这次马拉车只剩下

1     for(int i=1,id=0,mx=0;i<=n;i++)
2     {
3         for(p[i]=(i<=mx)?min(p[id*2-i],mx-i):0;a[i-p[i]]==a[i+p[i]+1];p[i]++);
4         if(p[i]+i>mx) id=i,mx=i+p[i];
5     }

(= =缩代码狂魔)

这次不要求奇偶讨论,所以连#都没插,注意在最后统计的时候可以用stl的特殊姿势

 1 #include <cstdio>
 2 #include <algorithm>
 3 #include <set>
 4 using namespace std;
 5 int n,u,v,ans,p[500001],q[500001],nex[500001],fir[500001];
 6 char a[500001];
 7 set<int> t;
 8 inline int min(int a,int b){return (a<b)?a:b;}
 9 inline int max(int a,int b){return (a>b)?a:b;}
10 bool cmp(int a,int b)
11 {
12     return (a-p[a])<(b-p[b]);
13 }
14 int main()
15 {
16     scanf("%d",&n);
17     char ch=getchar();
18     while(ch<'a' || ch>'z') ch=getchar();
19     for(int i=1;i<=n;ch=getchar())
20         a[i++]=ch;
21     for(int i=1,id=0,mx=0;i<=n;i++)
22     {
23         for(p[i]=(i<=mx)?min(p[id*2-i],mx-i):0;a[i-p[i]]==a[i+p[i]+1];p[i]++);
24         if(p[i]+i>mx) id=i,mx=i+p[i];
25     }
26     for(int i=1;i<=n;i++)q[i]=i;
27     sort(q+1,q+n+1,cmp);
28     int now=1;
29     for(int i=1;i<=n;i++)
30     {
31         while(now<=n&&q[now]-p[q[now]]<=i)
32         {
33             t.insert(q[now]);
34             now++;
35         }
36         set<int>::iterator tmp=t.upper_bound(i+p[i]/2);
37         if(tmp!=t.begin())
38         {
39             ans=max(ans,(*--tmp-i)*4);
40         }
41     }
42     printf("%d\n",ans);
43     return 0;
44 }

马拉车差不多告一段落(以后肯定还要返工)接下来再做点网络流吧

posted @ 2016-08-25 11:59  汪立超  阅读(163)  评论(0编辑  收藏  举报