剪花布条
Posted 给杰瑞一块奶酪~
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剪花布条相关的知识,希望对你有一定的参考价值。
一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案。对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢?
Input输入中含有一些数据,分别是成对出现的花布条和小饰条,其布条都是用可见ASCII字符表示的,可见的ASCII字符有多少个,布条的花纹也有多少种花样。花纹条和小饰条不会超过1000个字符长。如果遇见#字符,则不再进行工作。
Output输出能从花纹布中剪出的最多小饰条个数,如果一块都没有,那就老老实实输出0,每个结果之间应换行。
Sample Input
abcde a3 aaaaaa aa #Sample Output
0 3
第一次学习kmp,然后根据理解,做了一下这个题,用c做的
#include <stdio.h> #include <stdlib.h> #include <string.h> void findnext(char *str,int next[],int size) { int k = -1,i = 1; next[0] = -1; while(i < size) { while(k != -1 && str[k + 1] != str[i])k = next[k]; if(str[k + 1] == str[i])k ++; next[i ++] = k; } } int kmp(char *s,int ssize,char *p,int psize) { int next[1000],ans = 0; findnext(p,next,psize); // for(int i = 0;i < psize;i ++) // printf("%d ",next[i]); int k = -1,i = -1; while(++ i < ssize) { while(k != -1 && p[k + 1] != s[i])k = next[k]; if(p[k + 1] == s[i])k ++; if(k == psize - 1)ans ++,k = -1; } return ans; } int main() { char s[1000],p[1000]; while(~scanf("%s",s)&&strcmp(s,"#")) { scanf("%s",p); printf("%d\n",kmp(s,strlen(s),p,strlen(p))); } }
用c++ string类写了一下,不用像kmp考虑那么累
代码:
#include <iostream> #include <string> using namespace std; int check(string a,string b) { int d = b.size(),ans = 0; int size = a.size() - d + 1; string t; for(int i = 0;i <= size;i ++) { if(a[i] == b[0]) { t.assign(a,i,d); if(t == b) { ans ++; i += d - 1; } } } return ans; } int main() { string a,b; while(cin>>a&&a!="#") { cin>>b; cout<<check(a,b)<<endl; } }
以上是关于剪花布条的主要内容,如果未能解决你的问题,请参考以下文章