剪花布条 HDU

来源:互联网 发布:java获取svn版本号 编辑:程序博客网 时间:2024/05/17 03:01

今天做到了相关的题,感觉知识欠缺就想着写个总结加深一下记忆。

首先是今天看到的题:

一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案。对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢? 
Input:
输入中含有一些数据,分别是成对出现的花布条和小饰条,其布条都是用可见ASCII字符表示的,可见的ASCII字符有多少个,
布条的花纹也有多少种花样。花纹条和小饰条不会超过1000个字符长。如果遇见#字符,则不再进行工作。

Output:

输出能从花纹布中剪出的最多小饰条个数,如果一块都没有,那就老老实实输出0,每个结果之间应换行。
Sample Input:

abcde a3aaaaaa  aa#
Sample Output:
03

这个题数据卡的不严,暴力可以很轻松地跑过去。
以下是暴力的写法:

#include<cstdio>  #include<iostream>#include<cmath> #include<cstring>  using namespace std;     char a[1005];  char b[1005];  int main(){        while(scanf("%s",a+1)){    if(a[1]=='#')break; int result=0;    scanf("%s",b+1);      int len1=strlen(a+1);      int len2=strlen(b+1);      for(int i=1 ; i<=(len1-len2+1) ; i++){      int t=i;       for(int j=1 ; j<=len2 ;){              if(a[t]==b[j]){          t++;j++;          if(j == len2+1){j=1;i=i+len2-1;result++;break;}         }         else{   j=1;    break;}       }  }      printf("%d\n",result);  }  return 0;  }  
不过正所谓暴力肯定不是我们的最终目标,所以我上网查了查。

发现还有很多方法。

一 :C语言库里有strstr()可以用。需要头文件#include<cstring> || #include<string.h>例如:strstr(s1,s2);返回s2在s1中的第一个位置(有多个没法),返回类型是char *

二:C++中的string类的find函数例如: string str1 = "asdasd";int a = str1.find("asd",0);最终a = 0  这里返回类型为int,即下标。find里的第二个参数是代表从第几(下标)开始找。 

三:Kmp算法,BM算法。

这个比较麻烦,直接上大神传送门  点击打开链接