zoukankan      html  css  js  c++  java
  • 【KMP】剪花布条

    问题 K: 【KMP】剪花布条

    时间限制: 1 Sec  内存限制: 128 MB
    提交: 16  解决: 12
    [提交] [状态] [讨论版] [命题人:admin]

    题目描述

    一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案。对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢?

    输入

    输入中含有一些数据,分别是成对出现的花布条和小饰条,其布条都是用可见ASCII字符表示的,可见的ASCII字符有多少个,布条的花纹也有多少种花样。花纹条和小饰条不会超过1000个字符长。如果遇见#字符,则不再进行工作。

    输出

    输出能从花纹布中剪出的最多小饰条个数,如果一块都没有,那就老老实实输出0,每个结果之间应换行。

    样例输入

    abcde a3
    aaaaaa  aa
    #
    

    样例输出

    0
    3

    #include <bits/stdc++.h>
     
    using namespace std;
     
    int Next[10000];
    char t[10000];  //主串
    char p[10000];  //模式串
     
    int lenp,lent;
    void get_next()
    {
        int i,j;
        Next[0] = j = -1;
     
     
        i = 0;
        while(i<lenp)  //最后一位的判断其实是多余的
        {
            while(j!=-1&&p[j]!=p[i])
                j = Next[j];
            Next[++i] = ++j;
        }
    }
     
     
    int kmp3() //返回t串中有多少个p串
    {
        int i,j;
        i = j = 0;
        int ans = 0;
        while(i<lent)
        {
            while(j!=-1&&t[i]!=p[j])
                j = Next[j];
            if(j==lenp-1)
            {
                ans++;
                j = -1;    // j指针改变为-1 然后++ 从0重新查找
            }
            i++;
            j++;
        }
        return ans;
    }
     
    int main()
    {
        while(scanf("%s",t))
        {
     
            if(strcmp(t,"#")==0)
                break;
            scanf("%s",p);
     
            lenp = strlen(p);
            lent = strlen(t);
     
            get_next();
     
            int ans = kmp3();
            cout<<ans<<endl;
        }
     
        return 0;
    }
  • 相关阅读:
    perl dbi 控制事务
    READ-COMMITTED 不能进行可重复读和防止幻读
    REPEATABLE-READ 预读
    如何规划农商行商业智能系统中的决策分析系统?
    如何规划农商行商业智能系统中的决策分析系统?
    【MySQL】gap lock 浅析
    REPEATABLE-READ和READ-COMMITTED幻读
    ORA-01555: snapshot too old
    CXF动态客户端调用webservice实例
    mysql 区间锁
  • 原文地址:https://www.cnblogs.com/hao-tian/p/9643905.html
Copyright © 2011-2022 走看看