就是问每一行有多少keywords,重复的keywords可以累加。但如果keywords是某个单词的子串就不行,如keyword "abc" 在句子 " yj aabcc"中是没有的。换句话说,就是要完全匹配。
数据很小,暴力就能过。
#include <iostream> #include<stdio.h> #include<cstring> using namespace std; char key[30][30]; char str[25][100]; int re[25]; bool excuse(int c,int a,int b) //判断是否完全匹配 { //c:第几个句子 a:当前句子中的位置 b:第几个keyword int i = 1; for(i = 1;i < strlen(key[b]);i++) { if(str[c][a+i] == key[b][i] || str[c][a+i] +32 == key[b][i]) continue; else return false; } if(str[c][a+i] >= 65 && str[c][i] <= 122) //在‘A'到’z'之间 { return false; } else return true; } int main() { int k,e; int cnt = 1; while(scanf("%d %d",&k,&e)!=EOF) { int max = 0; memset(re,0,sizeof(re)); for(int i = 0 ;i < k;i++) { scanf("%s",key[i]); } getchar(); for(int i = 0;i < e;i++) str[i][0] = ' '; //把每个句子第0位置为空 for(int i = 0; i < e;i++) cin.getline(str[i]+1,100); //读取完整一行 for(int i =0 ;i < e;i++) { int j = 0; while(j < strlen(str[i])) { while(str[i][j] >= 65 && str[i][j] <= 122) //当没有读到下一个单词时 j++; j++; for(int m = 0; m < k;m++) { if(str[i][j] == key[m][0] || str[i][j] + 32 == key[m][0]) { if(excuse(i,j,m)) { re[i]++; j+=(strlen(key[m])-1); continue; } } } } if(re[i] >= max) max = re[i]; } printf("Excuse Set #%d\n",cnt++); for(int i = 0; i < e;i++) { if(re[i] == max) printf("%s\n",str[i]+1); } printf("\n"); } return 0; }