//存在一个错误,使用一个外循环和使用嵌套循环,存在异常 //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; }
//STL-set的应用:insert:插入,count:查找是否存在 //string-size()的应用:返回字符串的长度 //使用getline()切记要加一句getchar()来截取输入的换行符 #include <iostream> #include <cstdio> #include <cctype> #include <string> #include <set> using namespace std; int main() { int T(0); const int Max=25; struct Excuse { Excuse():counter(0){} string words; int counter; }; int K,E; while(cin>>K>>E) { set<string>keywords; for(int i=0;i<K;i++) { string u; cin>>u; keywords.insert(u); } getchar(); Excuse r[Max]; for(int i=0;i<E;i++) { getline(cin,r[i].words) string t(r[i].words); for(int j=0;j<t.size();j++) t[j]=tolower(t[j]); for(int j=0;j<t.size();j++) { string t2; while(isalpha(t[j])) t2+=t[j++]; if(keywords.count(t2)) r[i].counter++; } } int Max_count=-1; cout<<"Excuse Set #"<<++T<<endl; for(int i=0;i<E;i++) if(r[i].counter>Max_count) Max_count=r[i].counter; for(int i=0;i<E;i++) if(r[i].counter==Max_count) cout<<r[i].words<<endl; cout<<endl; } return 0; }