题干:
一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案。对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢?
Input输入中含有一些数据,分别是成对出现的花布条和小饰条,其布条都是用可见ASCII字符表示的,可见的ASCII字符有多少个,布条的花纹也有多少种花样。花纹条和小饰条不会超过1000个字符长。如果遇见#字符,则不再进行工作。 
 Output输出能从花纹布中剪出的最多小饰条个数,如果一块都没有,那就老老实实输出0,每个结果之间应换行。 
 Sample Input
abcde a3
aaaaaa  aa
#Sample Output
0
3
解题报告:
从i开始的不成立必须从i+1开始!不能从不成立的那个点开始!虽然也能水过,但是显然那样是不对的。
ac代码:(模拟)
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)
(稍后帖)(已补)
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开始读入字符串的话应该怎么写。
                










