zoukankan      html  css  js  c++  java
  • 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
    ",ans);
    40         while((ch<'a' || ch>'z')&&(ch!=EOF)) ch=getchar();
    41     }
    42     return 0;
    43 }
  • 相关阅读:
    前端面试:Vue.js常见的问题
    Web前端攻击方式及防御措施
    JavaScript代码规范
    bind、apply、call的理解
    Markdown标记语言简介及使用方法
    github个人主页的建立
    深度理解“高内聚低耦合”
    私有云与公有云的区别
    响应式网页设计
    redis和mongodb比较
  • 原文地址:https://www.cnblogs.com/wanglichao/p/5798856.html
Copyright © 2011-2022 走看看