hdu3068马拉车

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

没想到一个简单的优化能变成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 }

 

posted @ 2016-08-23 12:43  汪立超  阅读(168)  评论(0编辑  收藏  举报