HDU 2087 剪花布條【在字符串中不可重疊地尋找子串數量】
阿新 • • 發佈:2017-09-09
out oid main nbsp char 都沒有 進行 尋找 else 一塊花布條,裏面有些圖案,另有一塊直接可用的小飾條,裏面也有一些圖案。對於給定的花布條和小飾條,計算一下能從花布條中盡可能剪出幾塊小飾條來呢?
Input輸入中含有一些數據,分別是成對出現的花布條和小飾條,其布條都是用可見ASCII字符表示的,可見的ASCII字符有多少個,布條的花紋也有多少種花樣。花紋條和小飾條不會超過1000個字符長。如果遇見#字符,則不再進行工作。
Output輸出能從花紋布中剪出的最多小飾條個數,如果一塊都沒有,那就老老實實輸出0,每個結果之間應換行。
Sample Input
abcde a3 aaaaaa aa #
Sample Output
0 3
#include <iostream> #include庫函數strstr的運用<cstdio> #include <algorithm> #include <cstring> #define MAX 1000 + 10 using namespace std; char a[MAX], b[MAX]; int p = 0; int main() { while ( scanf("%s", a), a[0] != ‘#‘) { getchar(); scanf("%s", b); getchar(); int ans = 0;char *pa = a, *pb = b; while ( strstr( pa, pb)) { ans ++; pa = strstr( pa, pb); if ( strlen( pa) == strlen( pb)) { break; } pa += strlen( pb); } printf("%d\n", ans); } return 0; }
#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> using namespace std; #define M 10010 #define N 1000010 char s1[M],s2[N]; int next1[N]; int sum; void Nextll(int len2) { int i=-1,j=0; next1[0]=-1; while(j<len2) { if(i==-1||s2[i]==s2[j]) { ++i; ++j; next1[j]=i; } else i=next1[i]; } } void Kmp(int len1,int len2) { int i=0,j=0; sum=0; while(j<len1) { if(i==-1||s1[j]==s2[i]) { ++i; ++j; } else i=next1[i]; if(i==len2) { sum++; i=next1[i]; } } } int main() { while(~scanf("%s%s",s1,s2)) { if((strcmp(s1,"#")==0)||(strcmp(s2,"#")==0)) break; int len1=strlen(s1); int len2=strlen(s2); Nextll(len1); Kmp(len1,len2); printf("%d\n",sum); } return 0; }kmp
HDU 2087 剪花布條【在字符串中不可重疊地尋找子串數量】