HDU 2087 剪花布條(KMP)

來源:互聯網
上載者:User
剪花布條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;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.