zoukankan      html  css  js  c++  java
  • HDU 4749 Parade Show(贪心+kmp)

    题目链接

    题目都看不懂,做毛线。。。看懂了之后就是kmp出,所有的匹配区间,然后DP可以写,贪心也可以做把,DP应该需要优化一下,直接贪,也应该对的,经典贪心问题。

     1 #include<iostream>
     2 #include<cstring>
     3 #include<cstdio>
     4 #include<cmath>
     5 #include<algorithm>
     6 using namespace std;
     7 int s1[100001],s2[100001];
     8 int p[100001],o[100001];
     9 int next[100001];
    10 int flag[100001];
    11 int judge(int x,int y)
    12 {
    13     if(x == y)
    14     return 1;
    15     else if(x > y)
    16     return 0;
    17     else
    18     return -1;
    19 }
    20 int main()
    21 {
    22     int n,m,k,len1,len2,i,j;
    23     while(scanf("%d%d%d",&n,&m,&k)!=EOF)
    24     {
    25         memset(flag,0,sizeof(flag));
    26         for(i = 0;i < n;i ++)
    27         scanf("%d",&p[i]);
    28         for(i = 0;i < m;i ++)
    29         scanf("%d",&o[i]);
    30         if(m == 1)
    31         {
    32             printf("%d
    ",n);
    33             continue;
    34         }
    35         for(i = 0;i < m-1;i ++)
    36         s1[i] = judge(o[i+1],o[i]);
    37         for(i = 0;i < n-1;i ++)
    38         s2[i] = judge(p[i+1],p[i]);
    39         len1 = m-1;//kmp
    40         len2 = n-1;
    41         next[0] = -1;
    42         j = -1;
    43         for(i = 1;i < len1;i ++)
    44         {
    45             while(j >= 0&&s1[j+1] != s1[i])
    46             j = next[j];
    47             if(s1[j+1] == s1[i]) j ++;
    48             next[i] = j;
    49         }
    50         j = -1;
    51         for(i = 0;i < len2;i ++)
    52         {
    53             while(j >= 0&&s1[j+1] != s2[i])
    54             j = next[j];
    55             if(s1[j+1] == s2[i])j ++;
    56             if(j == len1-1)
    57             {
    58                 flag[i-len1+1] = 1;
    59                 j = next[j];
    60             }
    61         }
    62         int ans = 0;
    63         for(i = 0;i < n-1;i ++)
    64         {
    65             if(flag[i])
    66             {
    67                 ans ++;
    68                 i = i + m - 1;
    69             }
    70         }
    71         printf("%d
    ",ans);
    72     }
    73     return 0;
    74 }
  • 相关阅读:
    一个不确定内容的数组,统计每个元素出现的次数的方法
    WebStorm配置TSLint
    angualr 项目环境搭建
    angular6 导出json数据到excal表
    angular6 引用echart第一次数据不显示解决
    angular6 开发实践基础知识汇总
    angular6实现对象转换数组对象
    angular 实现左侧和顶部固定定位布局
    ASP.NET MVC 全局异常
    IOC容器之Autofac
  • 原文地址:https://www.cnblogs.com/naix-x/p/3334941.html
Copyright © 2011-2022 走看看