剪花布條
阿新 • • 發佈:2017-11-01
bcd har == tdi cnblogs scan char cde 都是 一塊花布條,裏面有些圖案,另有一塊直接可用的小飾條,裏面也有一些圖案。對於給定的花布條和小飾條,計算一下能從花布條中盡可能剪出幾塊小飾條來呢?
Input輸入中含有一些數據,分別是成對出現的花布條和小飾條,其布條都是用可見ASCII字符表示的,可見的ASCII字符有多少個,布條的花紋也有多少種花樣。花紋條和小飾條不會超過1000個字符長。如果遇見#字符,則不再進行工作。
Output輸出能從花紋布中剪出的最多小飾條個數,如果一塊都沒有,那就老老實實輸出0,每個結果之間應換行。
Sample Input
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; } }
剪花布條