1. 程式人生 > >剪花布條

剪花布條

bcd har == tdi cnblogs scan char cde 都是

一塊花布條,裏面有些圖案,另有一塊直接可用的小飾條,裏面也有一些圖案。對於給定的花布條和小飾條,計算一下能從花布條中盡可能剪出幾塊小飾條來呢?

Input輸入中含有一些數據,分別是成對出現的花布條和小飾條,其布條都是用可見ASCII字符表示的,可見的ASCII字符有多少個,布條的花紋也有多少種花樣。花紋條和小飾條不會超過1000個字符長。如果遇見#字符,則不再進行工作。
Output輸出能從花紋布中剪出的最多小飾條個數,如果一塊都沒有,那就老老實實輸出0,每個結果之間應換行。
Sample Input
abcde a3
aaaaaa  aa
#
Sample Output
0
3

第一次學習kmp,然後根據理解,做了一下這個題,用c做的

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void findnext(char *str,int next[],int size)
{
    int k = -1,i = 1;
    next[0] = -1;
    while(i < size)
    {
        while(k != -1 && str[k + 1] != str[i])k = next[k];
        
if(str[k + 1] == str[i])k ++; next[i ++] = k; } } int kmp(char *s,int ssize,char *p,int psize) { int next[1000],ans = 0; findnext(p,next,psize); // for(int i = 0;i < psize;i ++) // printf("%d ",next[i]); int k = -1,i = -1; while(++ i < ssize) {
while(k != -1 && p[k + 1] != s[i])k = next[k]; if(p[k + 1] == s[i])k ++; if(k == psize - 1)ans ++,k = -1; } return ans; } int main() { char s[1000],p[1000]; while(~scanf("%s",s)&&strcmp(s,"#")) { scanf("%s",p); printf("%d\n",kmp(s,strlen(s),p,strlen(p))); } }

用c++ string類寫了一下,不用像kmp考慮那麽累

代碼:

#include <iostream>
#include <string>

using namespace std;
int check(string a,string b)
{
    int d = b.size(),ans = 0;
    int size = a.size() - d + 1;
    string t;
    for(int i = 0;i <= size;i ++)
    {
        if(a[i] == b[0])
        {
            t.assign(a,i,d);
            if(t == b)
            {
                ans ++;
                i += d - 1;
            }
        }
    }
    return ans;
}
int main()
{
    string a,b;
    while(cin>>a&&a!="#")
    {
        cin>>b;
        cout<<check(a,b)<<endl;
    }
}

剪花布條