题干:
一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案。对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢?
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->b
while(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开始读入字符串的话应该怎么写。博客链接