码迷,mamicode.com
首页 > 其他好文 > 详细

【不可能的任务6/200】hdu3068马拉车

时间:2016-08-23 14:32:29      阅读:123      评论:0      收藏:0      [点我收藏+]

标签:

其实马拉车还真是最好理解的算法(感觉初中的时候好像讲过类似的,但是当时就没有认真听)

没想到一个简单的优化能变成O(n),感觉碉堡

不说了,马拉车裸题,我在写的时候只保留了id,没保留mx,希望能形成一种代码习惯吧

 1 #include <cstdio>
 2 int n;char ch;
 3 int p[220002];
 4 char a[220002];
 5 int min(int a,int b){return(a<b)?a:b;}
 6 int max(int a,int b){return(a>b)?a:b;}
 7 int get(int k){return (k&1)?p[k]/2*2:(p[k]+1)/2*2-1;}
 8 void add(int i)
 9 {
10     int u=i-p[i],v=i+p[i];
11     while((a[u]==a[v]) && (u>0) && (v<=n))
12         u--,v++,p[i]++;    
13 }
14 int main()
15 {
16     while((ch<a || ch>z)&&(ch!=EOF)) ch=getchar();
17     while(ch!=EOF)
18     {
19         n=1;a[1]=0;
20         for(;ch>=a && ch<=z;ch=getchar())
21             a[++n]=ch,a[++n]=0;
22         int id=0;
23         for(int i=1;i<=n;i++)
24         {
25             if(i<id+p[id])
26             {
27                 p[i]=min(p[id*2-i],id+p[id]-i);
28                 if(i+p[i]==id+p[id])
29                     add(i);
30             }
31             else
32                 p[i]=1,add(i);
33             if(i+p[i]>p[id]+id)
34                 id=i;
35         }
36         int ans=0;
37         for(int i=1;i<=n;i++)
38             ans=max(ans,get(i));
39         printf("%d\n",ans);
40         while((ch<a || ch>z)&&(ch!=EOF)) ch=getchar();
41     }
42     return 0;
43 }

 

【不可能的任务6/200】hdu3068马拉车

标签:

原文地址:http://www.cnblogs.com/wanglichao/p/5798856.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!