题干:
一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案。对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢?
Input输入中含有一些数据,分别是成对出现的花布条和小饰条,其布条都是用可见ASCII字符表示的,可见的ASCII字符有多少个,布条的花纹也有多少种花样。花纹条和小饰条不会超过1000个字符长。如果遇见#字符,则不再进行工作。
Output输出能从花纹布中剪出的最多小饰条个数,如果一块都没有,那就老老实实输出0,每个结果之间应换行。
Sample Input
abcde a3
aaaaaa aa
#
Sample Output
0
3
解题报告:
从i开始的不成立必须从i+1开始!不能从不成立的那个点开始!虽然也能水过,但是显然那样是不对的。
ac代码:(模拟)
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;char a[1000 + 5];
char b[1000 + 5];
int main()
{int lena,lenb;while(scanf("%s",a)) {if(a[0]=='#') break;scanf("%s",b);lena=strlen(a);lenb=strlen(b);int cnt=0;int x=0,y=0;//x->a y->bwhile(x<lena) {if(a[x]==b[y]) {x++;y++;if(y==lenb) {cnt++;y=0;}}else {x=x-y+1;y=0; } }printf("%d\n",cnt); }return 0 ;
}
ac代码2:(KMP)
(稍后帖)(已补)
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
char s[1000005];
char t[1000005];
int next[1000005];
int len1,len2;
void getnext() {int j = 0,k = -1;next[0] = -1;while(j<len2-1) {if(k == -1 || t[j] == t[k]) {j++,k++;next[j] = k;}else k = next[k];}
}
int kmp() {int cnt = 0;int i=0,j=0;while(i < len1) {if(j == -1 || s[i] == t[j]) {i++,j++;}else {j=next[j];}if(j >= len2) {cnt++;j=0;}}return cnt;}
int main()
{while(~scanf("%s",s)) {if(s[0] == '#') break;scanf("%s",t);len1 = strlen(s);len2 = strlen(t);getnext();printf("%d\n",kmp());}return 0;
}
总结:
今天是2018.10.22,时隔三个月,,我终于是来补上这篇KMP的代码了。感慨万千啊!!原来三个月前的我还是只会写暴力,代码格式十分丑陋的小渣渣,一暑假的熏陶,真的是看到了自己的变化。应了学长那句话啊,暑假留校的时光必定会是你进步最快的两个月!!!感谢经历!!祝自己越来越好。
另:可以看看自己对KMP模板总结的那个博客,想想如果从1开始读入字符串的话应该怎么写。博客链接