2087 剪花布條

剪花布條

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


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

Input
輸入中含有一些數據,分別是成對出現的花布條和小飾條,其布條都是用可見ASCII字符表示的,可見的ASCII字符有多少個,布條的花紋也有多少種花樣。花紋條和小飾條不會超過1000個字符長。如果遇見#字符,則不再進行工作。
 

Output
輸出能從花紋布中剪出的最多小飾條個數,如果一塊都沒有,那就老老實實輸出0,每個結果之間應換行。
 

Sample Input
abcde a3 aaaaaa aa #


Sample Output
0 3

題目大意:給定字符串a和b,求b在a中出現的次數

思路:KMP算法模板題,只不過在kmp時,返回的不是b在a中出現的起始位置,應該改成答案(ans)加一,然後把j置爲0,繼續比對

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<map>
#define LL long long
using namespace std;
const int maxn = 1000+5;
int ans,Next[maxn];
void getNext(string s)
{
    int ls=s.size();
    Next[0]=-1;
    Next[1]=0;
    for(int i=2;i<=ls;i++){
        if(s[i-1]==s[Next[i-1]]) Next[i]=Next[i-1]+1;
        else{
            int t=Next[i-1];
            while(s[i-1]!=s[t]){
                t=Next[t];
                if(t==-1) break;
            }
            Next[i]=t+1;
        }
    }
}
void kmp(string a,string b)
{
    getNext(b);
    int la=a.size(),i=0;
    int lb=b.size(),j=0;
    while(i<la && j<lb){
        if(j==-1 || a[i]==b[j]) i++,j++;
        else j=Next[j];
        if(j==lb) ans++,j=0;
    }
}
int main()
{
    cin.sync_with_stdio(false);
    string a,b;
    while(cin>>a){
        if(a[0]=='#') break;
        cin>>b;
        ans=0;
        kmp(a,b);
        cout<<ans<<endl;
    }
    return 0;
}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章