//存在一个错误,使用一个外循环和使用嵌套循环,存在异常 //gets()得到一串含空格的字符串 #include <stdio.h> #include <string.h> #include <ctype.h> /*int Match(char os[],char ot[]) { int len1=strlen(os),len2=strlen(ot);//注意不要搞混strlen() 和 sizeof() char s[25],t[75]; int count=0; for(int i=0;i<=len1;i++) { if(isupper(os[i])) s[i]=tolower(os[i]); else s[i]=os[i]; } for(int i=0;i<=len2;i++) { if(isupper(ot[i])) t[i]=tolower(ot[i]); else t[i]=ot[i]; } // s[len1]='\0'; // t[len2]='\0'; for(int i=0;i<=len2-len1;) { int j; for(j=0;j<len1;) { if(s[j]==t[i]) { i++; j++; } else { i=i-j+1; j=0; break; } } if(j==len1) { int left,right; left=i-j-1; right=i; if((left<0 || !isalpha(t[left])) && (right>=len2 || !isalpha(t[right]))) count++; } } return count; }*/ void GetNext(char s[],int next[]) { int len=strlen(s); next[0]=-1; /*int j=0; for(int k=1;k<len;) { if(s[k]==s[j]) { j++; k++; next[k]=j; } else { while(j!=-1 && s[k]!=s[j]) j=next[j]; k++; j++; next[k]=j; } }*/ int j=-1; for(int k=0;k<len;) { if(j==-1 || s[k]==s[j]){++k;++j;next[k]=j;} else j=next[j]; } } int KMP_Match(char os[],char ot[]) { int len1=strlen(os),len2=strlen(ot);//注意不要搞混strlen() 和 sizeof() char s[25],t[75]; int next[25]; int count=0; for(int i=0;i<=len1;i++) { if(isupper(os[i])) s[i]=tolower(os[i]); else s[i]=os[i]; } for(int i=0;i<=len2;i++) { if(isupper(ot[i])) t[i]=tolower(ot[i]); else t[i]=ot[i]; } GetNext(s,next); for(int i=0,j=-1;i<=len2-len1;) { if(j==-1 || s[j]==t[i]) { i++; j++; } else { j=next[j]; } /*for(int i=0;i<=len2-len1;) { int j; for(j=0;j<len1;) { if(s[j]==t[i]) { i++; j++; } else { //i=i-j+1; //j=0; j=next[j]; if(j==-1) { i++; break; } } }*/ /*for(;j<len1;) { if(j==-1 || s[j]==t[i]) { i++; j++; } else { j=next[j]; break; } }*/ if(j>=len1) { int left,right; left=i-j-1; right=i; if((left<0 || !isalpha(t[left])) && (right>=len2 || !isalpha(t[right]))) count++; j=0; } } return count; } int main() { char keys[25][25],excuses[25][75]; int count[25]; int K,E; int cas=0; while(scanf("%d%d",&K,&E)==2) { ++cas; //getchar(); memset(count,0,sizeof(count)); int max=-1; for(int i=0;i<K;i++) scanf("%s",keys[i]); getchar();//需要截取一个换行符 for(int i=0;i<E;i++) gets(excuses[i]); for(int i=0;i<E;i++) { for(int j=0;j<K;j++) count[i]+=KMP_Match(keys[j],excuses[i]); if(count[i]>max) max=count[i]; } printf("Excuse Set #%d\n",cas); for(int i=0;i<E;i++) //if(count[i]==max) // printf("%s\n",excuses[i]); printf("%s\t%d\n",excuses[i],count[i]); printf("\n"); } return 0; }