剪花布條Problem Description一塊花布條,裡面有些圖案,另有一塊直接可用的小飾條,裡面也有一些圖案。對於給定的花布條和小飾條,計算一下能從花布條中儘可能剪出幾塊小飾條來呢?
Input輸入中含有一些資料,分別是成對出現的花布條和小飾條,其布條都是用可見ASCII字元表示的,可見的ASCII字元有多少個,布條的花紋也有多少種花樣。花紋條和小飾條不會超過1000個字元長。如果遇見#字元,則不再進行工作。
Output輸出能從花紋布中剪出的最多小飾條個數,如果一塊都沒有,那就老老實實輸出0,每個結果之間應換行。
Sample Input
abcde a3aaaaaa aa#
Sample Output
03
Authorqianneng
Source冬練三九之二
Recommendlcy 這個題目就是一個KMP演算法的入門練習手題,比較簡單,但是這個題目和平時匹配的不一樣,這個題目匹配成功的部分不能進行再次匹配所以在匹配成功的時候直接把j變成0重新開始匹配,因為是剪布條嘛,剪了就沒了,所以要這樣!
#include <iostream>#include <string.h>#include <stdio.h>using namespace std;char str[200001];int next[200001];char rec[200001];int n;int get_next(){int i=0,j=-1;next[0]=-1;while(str[i]){if(j==-1 || str[i]==str[j]){i++;j++;next[i]=j;}elsej=next[j];}return 0;}int find_ans(){int ans=0;int i=0,j=0;while(rec[i]){if(rec[i]==str[j]){if(j==n-1)ans++,j=0,i++;elsej++,i++;}else{j=next[j];}if(j==-1)j=0,i++;}return ans;}int main(){int t,i,j;while(scanf("%s",rec)){if(rec[0]=='#')return 0;scanf("%s",str);n=strlen(str);get_next();printf("%d\n",find_ans());}return 0;}