1. 程式人生 > >hdu 2087 剪花布條 kmp小水

hdu 2087 剪花布條 kmp小水

剪花布條

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3083    Accepted Submission(s): 2079


Problem Description 一塊花布條,裡面有些圖案,另有一塊直接可用的小飾條,裡面也有一些圖案。對於給定的花布條和小飾條,計算一下能從花布條中儘可能剪出幾塊小飾條來呢?

Input 輸入中含有一些資料,分別是成對出現的花布條和小飾條,其布條都是用可見ASCII字元表示的,可見的ASCII字元有多少個,布條的花紋也有多少種花樣。花紋條和小飾條不會超過1000個字元長。如果遇見#字元,則不再進行工作。

Output 輸出能從花紋布中剪出的最多小飾條個數,如果一塊都沒有,那就老老實實輸出0,每個結果之間應換行。

Sample Input abcde a3aaaaaa aa#Sample Output03普通方法版本很弱智
#include<stdio.h>
#include<string.h>
char a[1005];
char b[1005];
int main()
{
 int i,j,d1,d2,k,cnt;
    while(scanf("%s",a+1))
 {
  cnt=0;
  if(a[1]=='#') return 0;
          scanf("%s",b+1);
    d1=strlen(a+1);
    d2=strlen(b+1);
       for(i=1;i<=d1-d2+1;i++)   
    {
     k=i;
     for(j=1;j<=d2;)
     {
                   if(a[k]==b[j]) 
       {
        k++;j++;
        if(j==d2+1) {cnt++;j=1;i=i+d2-1;break;}
       }
       else {j=1; break;}
     }
    }
     printf("%d\n",cnt);
 }
 return 0;
}
/*kmp版本*/
#include<stdio.h>
#include<string.h>
char a[1005];
char b[1005];
int d1,d2;
int next[1005];
void get_next()
{
 int i,j;
 i=1;
 j=0;
        next[1]=0;
 while(i<d1)
 {
  if(j==0||b[i]==b[j]) {i++;j++;next[i]=j;}
  else j=next[j];
 }
}
int KMP()
{
 int i=1,j=1,cnt=0;
 while(i<=d1)
 {
  
  if(j==0||a[i]==b[j]) {i++;j++;}
  else j=next[j];
  if(j>d2) {cnt++;j=1;};//不能是等於 是大於 因為上面是//j++ 等於的時候實際上少了一個
  
 }
 return cnt;
}
int main()
{
 int i,j,ans;
    while(scanf("%s",a+1))
 {
  if(a[1]=='#') return 0;
          scanf("%s",b+1);
    d1=strlen(a+1);
    d2=strlen(b+1);
    get_next();
    ans=KMP();
    printf("%d\n",ans);
 }
 return 0;
}
/*總結  可以看出 有時候用普通的方法做也很簡單   但是等真正的掌握了KMP  做這種題目就更加簡單     一開始可能覺得這種小題用KMP 沒必要 
但是用熟練了   用KMP做可能會更快 更準確   還得防超時*/



相關推薦

hdu 2087 布條 kmp

剪花布條 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3083    Accepted Submission

HDU 2087 布條 KMP(判斷不重疊區間加以判斷)在看題中逐漸理解kmp...

http://acm.hdu.edu.cn/showproblem.php?pid=2087 #include <iostream> #include<cstdio> #include<algorithm> #include<cstring> #i

題解報告:hdu 2087 布條KMP入門)

不變 indent spa bottom fix href pac transform eight 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=2087 Problem Description 一塊花布條,裏面有些圖案,另有

HDU 2087 布條

arc sci aps == clas cst tabs desc accep Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submissi

HDU 2087: 布條

col 輸出 之間 剪花布條 結果 出現 bcd sci aaaaaa HDU 2087: 剪花布條 題目描述 一塊花布條,裏面有些圖案,另有一塊直接可用的小飾條,裏面也有一些圖案。對於給定的花布條和小飾條,計算一下能從花布條中盡可能剪出幾塊小飾條來呢? 輸入 輸入中含

hdu-2087 布條

Problem Description 一塊花布條,裡面有些圖案,另有一塊直接可用的小飾條,裡面也有一些圖案。對於給定的花布條和小飾條,計算一下能從花布條中儘可能剪出幾塊小飾條來呢?   Input 輸入中含有一些資料,分

HDU 2087 布條

剪花布條 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi

HDU 2087布條KMP 匹配)

題目:Description一塊花布條,裡面有些圖案,另有一塊直接可用的小飾條,裡面也有一些圖案。對於給定的花布條和小飾條,計算一下能從花布條中儘可能剪出幾塊小飾條來呢? Input輸入中含有一些資料,

hdu——2087花布條 ( kmp 和 find用法 )

                                                                                                     剪花布條 Time Limit: 1000/1000 MS (Java/

布條 HDU - 2087(KMP 貪心選擇)

題意:       給定兩個串S 和 T,求S中最多不重疊的包含了多少個T串. 分析:      不重疊的話,就是在正常的KMP基礎上,匹配到T的末尾的時候,j要回到0.   #include<bits/

C - 布條 HDU-2087

cin con cnblogs color cst 解題思路 cto ons ack 解題思路: 求不重疊的匹配次數。 參考代碼: 1 #include <iostream> 2 #include <vector> 3 #inc

HDU 2087 花布條 (簡單KMP或者暴力)

string abcde 都沒有 chm strlen oba bre while align 剪花布條 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)

HDU2087 布條KMP

inpu math 另有 vector 進行 put 多少 for 模板題 HDU2087 剪花布條 一塊花布條,裏面有些圖案,另有一塊直接可用的小飾條,裏面也有一些圖案。對於給定的花布條和小飾條,計算一下能從花布條中盡可能剪出幾塊小飾條來呢? Input 輸入中含有一些數

hdu2087-自己的理解&kmp講解-布條

http://acm.hdu.edu.cn/showproblem.php?pid=2087 連結 時隔多年,終於理解kmp了。。 1 進行字串匹配,如果進行暴力匹配的話,(即一個一個找,時間複雜度O(len1*len2),是不可取的,) 2 所以

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

out oid main nbsp char 都沒有 進行 尋找 else 一塊花布條,裏面有些圖案,另有一塊直接可用的小飾條,裏面也有一些圖案。對於給定的花布條和小飾條,計算一下能從花布條中盡可能剪出幾塊小飾條來呢? Input輸入中含有一些數據,分別是成對出現的花布

布條

bcd har == tdi cnblogs scan char cde 都是 一塊花布條,裏面有些圖案,另有一塊直接可用的小飾條,裏面也有一些圖案。對於給定的花布條和小飾條,計算一下能從花布條中盡可能剪出幾塊小飾條來呢? Input輸入中含有一些數據,分別是成

HDU2087 布條

for problem ostream pac cstring list () math str1 題目地址:http://acm.hdu.edu.cn/showproblem.php?pid=2087 這道題看大佬們都用KMP做,但本萌新用string弱弱水過。。。

LOJ #10043. 「一本通 2.2 例 1」布條

題目描述 原題來自:HDU 2087 一塊花布條,裡面有些圖案,另有一塊直接可用的小飾條,裡面也有一些圖案。對於給定的花布條和小飾條,計算一下能從花布條中儘可能剪出幾塊小飾條來呢? 輸入格式 輸入資料為多組資料,讀取到 # 字元時結束。每組資料僅有一行,為由空格分

布條 cmp簡單入門

#include <stdio.h> #include <stdlib.h> #include<string.h> int main() { int i,len1,len2,cnt; char str1[1001],str2[1001

3708 Problem C 布條

問題 C: 剪花布條 時間限制: 1000 Sec  記憶體限制: 10000 MB 提交: 33  解決: 17   題目描述 一塊花布條,裡面有些圖案,另有一塊直接可用的小飾條,裡面也有一些