题干:

一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案。对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢? 

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开始读入字符串的话应该怎么写。博客链接