• HDU 2087 剪花布条 (简单KMP或者暴力)


    剪花布条

    Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 28917    Accepted Submission(s): 17714


    Problem Description
    一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案。对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢?
     
    Input
    输入中含有一些数据,分别是成对出现的花布条和小饰条,其布条都是用可见ASCII字符表示的,可见的ASCII字符有多少个,布条的花纹也有多少种花样。花纹条和小饰条不会超过1000个字符长。如果遇见#字符,则不再进行工作。
     
    Output
    输出能从花纹布中剪出的最多小饰条个数,如果一块都没有,那就老老实实输出0,每个结果之间应换行。
     
    Sample Input
    abcde a3 aaaaaa aa #
     
    Sample Output
    0 3
     
    Author
    qianneng
     
    Source
     
    Recommend
    lcy   |   We have carefully selected several similar problems for you:  1686 3746 3336 1358 3068 
     
    分析:
    KMP或者简单暴力
     
    KMP:
    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<memory>
    using namespace std;
    char moban[1005],wenben[1005];
    int next1[1005];
    int sum;
    void getnext(char* s,int* next1,int m)
    {
        next1[0]=0;
        next1[1]=0;
        for(int i=1;i<m;i++)
        {
            int j=next1[i];
            while(j&&s[i]!=s[j])
                j=next1[j];
            if(s[i]==s[j])
                next1[i+1]=j+1;
            else
                next1[i+1]=0;
        }
    }
    void kmp(char* ss,char* s,int* next1,int n,int m)
    {
        int ans=0;
        getnext(s,next1,m);
        int j=0;
        for(int i=0;i<n;i++)
        {
            while(j&&s[j]!=ss[i])
                j=next1[j];
            if(s[j]==ss[i])
                j++;
            if(j==m)
            {
               ans++;
               j=0;
            }
        }
        printf("%d
    ",ans);
    }
    int main()
    {
        while(~scanf("%s",wenben))
        {
            if(wenben[0]=='#')
                break;
            scanf("%s",moban);
            int n=strlen(wenben);
            int m=strlen(moban);
            kmp(wenben,moban,next1,n,m);
        }
        return 0;
    }

    暴力:

    #include<stdio.h>
    #include<string.h>
    using namespace std;
    #define max_v 1005
    char s1[max_v],s2[max_v];
    int main()
    {
        while(~scanf("%s",s1))
        {
            if(s1[0]=='#')
                break;
            scanf("%s",s2);
            int l1=strlen(s1);
            int l2=strlen(s2);
            int sum=0;
            int j=0;
            for(int i=0; i<l1; i++)
            {
                if(s1[i]==s2[j])
                {
                    j++;
                }
                else
                {
                    j=0;
                }
                if(j==l2)
                {
                    sum++;
                    j=0;
                }
            }
            printf("%d
    ",sum);
        }
    }
     
  • 相关阅读:
    用fiddler测试ip轮询
    ubuntu下安装fiddler
    Andriod相机开发关于startPreview Failed的错误的特别记录(重要)
    我的Cocos2dx开发模式
    Android WebView导入HTML使Js生效的方法
    Lua快捷键
    String,StringBuilder,StringBuffer的对比测试
    重构视角(摘抄)
    String属于“假引用类型”,代码为证(一个String引发的血案...)
    static class
  • 原文地址:https://www.cnblogs.com/yinbiao/p/9457482.html
Copyright © 2020-2023  润新知