zoukankan      html  css  js  c++  java
  • HDU 2087

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2087

    Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)

    Problem Description
    一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案。对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢?
     
    Input
    输入中含有一些数据,分别是成对出现的花布条和小饰条,其布条都是用可见ASCII字符表示的,可见的ASCII字符有多少个,布条的花纹也有多少种花样。花纹条和小饰条不会超过1000个字符长。如果遇见#字符,则不再进行工作。
     
    Output
    输出能从花纹布中剪出的最多小饰条个数,如果一块都没有,那就老老实实输出0,每个结果之间应换行。
     
    Sample Input
    abcde a3
    aaaaaa aa
    #
     
    Sample Output
    0
    3
     
    首先第一感觉,嗯好像就是和 HDU 1686 - Oulipo http://www.cnblogs.com/dilthey/p/7442912.html一样的题嘛……
    然后仔细看一下,发现因为是“剪布条”,所以不能重复用字段,所以要进行一点小修改。
    很自然的想到,原本在文本串中找到了模式串之后,单纯ans++,下一次循环必然是j=Next[j],就是j回溯到Next[j]位置;
    那么,这个时候就相当于用了一些重复字段(Next[j]位置前的那些字符,都是被重复使用了),那么显然,在ans++之后,我们把j重新赋值为0即可。
     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 #define MAX 1000+5
     5 using namespace std;
     6 int Next[MAX];
     7 char str[MAX],pat[MAX];
     8 void getNext()
     9 {
    10     int i=0, j=-1, len=strlen(pat);
    11     Next[0]=-1;
    12     while(i<len)
    13     {
    14         if(j == -1 || pat[i] == pat[j]) Next[++i]=++j;
    15         else j=Next[j];
    16     }
    17 }
    18 int kmp()
    19 {
    20     getNext();
    21     int i=0, j=0, len1=strlen(str), len2=strlen(pat);
    22     int ans=0;
    23     while(i<len1)
    24     {
    25         if(j == -1 || str[i] == pat[j]) i++, j++;
    26         else j=Next[j];
    27         if(j == len2)
    28         {
    29             ans++;
    30             j=0;
    31         }
    32     }
    33     return ans;
    34 }
    35 int main()
    36 {
    37     while(cin>>str)
    38     {
    39         if(str[0]=='#') break;
    40         cin>>pat;
    41         cout<<kmp()<<endl;
    42     }
    43 }
  • 相关阅读:
    排列与组合
    C++构造函数虚函数例题
    排序
    Android相机是如何获取到图像的
    《Android进阶》之第七篇 NDK的使用
    递归相关题目
    华为模拟性格测试
    平衡二叉树
    Fragment回调接口应用间分享数据
    IOS中限制TextField中输入的类型以及长度
  • 原文地址:https://www.cnblogs.com/dilthey/p/7451524.html
Copyright © 2011-2022 走看看