1. 程式人生 > >HDU 2087 剪花布條【在字符串中不可重疊地尋找子串數量】

HDU 2087 剪花布條【在字符串中不可重疊地尋找子串數量】

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 
<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
; }
庫函數strstr的運用 技術分享
#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 剪花布條【在字符串中不可重疊地尋找子串數量】