这个题目刚开始觉得测试数据都能过但是一直wa,都找不到错在哪,觉得很有挫败感,但是后来才发现原来由于习惯导致了一个错误。
以下为正确代码:
#include<stdio.h> #include<string.h> #include<stdlib.h> char a[1010],b[1010]; int next[1010]; int n,m; void get_next() { int i=0,j=-1; next[0]=-1; while(i<m-1) { if(b[i]==b[j]||j==-1) { i++; j++; if(b[i]!=b[j]) { next[i]=j; } else { next[i]=next[j]; } } else { j=next[j]; } } } int kmp() { int i,j; i=j=0; int k=0; while(i<n) { if(a[i]==b[j]||j==-1) { i++; j++; } else { j=next[j]; } if(j==m) { k++; j=0; } } return k; } int main() { while(scanf("%s%s",a,b),a[0]!='#') { n=strlen(a); m=strlen(b); get_next(); int p=kmp(); printf("%d\n",p); memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(next,0,sizeof(next)); } system("pause"); return 0; }
以下为错误代码:
#include<stdio.h> #include<string.h> #include<stdlib.h> char a[1010],b[1010]; int next[1010]; void get_next() { int i=1,j=0; next[1]=0; while(i<b[0]-'0') { if(b[i]==b[j]||j==0) { i++; j++; if(b[i]!=b[j]) { next[i]=j; } else { next[i]=next[j]; } } else { j=next[j]; } } } int kmp() { int i,j; i=j=1; int k=0; while(i<=a[0]-'0') { if(a[i]==b[j]||j==0) { i++; j++; } else { j=next[j]; } if(j>b[0]-'0') { k++; j=1; } } return k; } int main() { while(scanf("%s%s",a,b),a[0]!='#') { int n=strlen(a); int m=strlen(b); for(int i=n;i>=1;i--) { a[i]=a[i-1]; } for(int j=m;j>=1;j--) { b[j]=b[j-1]; } a[0]=n+'0'; b[0]=m+'0';//这之前的代码完全为多此一举,由于习惯问题,习惯于用a【0】存数组大小,但是忽略了一点,所开的数组是字符型的,而m,n的大小可以为10000,会超内存的,之前都没考虑到。 get_next(); int p=kmp(); printf("%d\n",p); memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(next,0,sizeof(next)); } // system("pause"); return 0; }