【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;
}

 

posted @ 2018-09-13 23:17  zangzang  阅读(366)  评论(0编辑  收藏  举报