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 }
  • 相关阅读:
    php和c++自带的排序算法
    谷歌Chrome浏览器离线安装包
    js阻止表单提交
    Sublime text中文乱码解决办法
    不会飞的鸟
    linux命令**50
    linux基础2
    linux基础1
    css3实现单行文本溢出显示省略号
    null和undefined的区别
  • 原文地址:https://www.cnblogs.com/wanglichao/p/5798856.html
Copyright © 2011-2022 走看看