Esta pregunta parece más difícil (problemática) de Grado B. Después de todo, la escribí durante más de una hora. . . Usé muchas operaciones con cuerdas, tal vez soy demasiado inteligente. . .
#include <cstdio>
#include <iostream>
#include <string>
using namespace std;
struct Title{
int grade;
string da;
};
int ff[110][7] = {
};
int main(){
int n, m;
scanf("%d %d", &n, &m);
Title title[m+1];
double grade[n] = {
0};
for(int i=1; i<=m; i++){
int gs;
scanf("%d %d", &title[i].grade, &gs);
int num;
scanf("%d", &num);
string da = "";
for(int j=0; j<num; j++){
string s;
cin >> s;
da += s;
}
title[i].da = da;
}
getchar();
for(int i=0; i<n; i++){
for(int j=1; j<=m; j++){
getchar();
int num;
int flag = 0;
cin >> num;
string da = "";
for(int k=0; k<num; k++){
char s;
cin >> s;
da += s;
if(title[j].da.find(s) == string::npos){
flag = 1;
ff[j][s-'a'+1]++;
}
}
for(int k=0; k<title[j].da.size(); k++){
char c = title[j].da[k];
if(da.find(c) == string::npos){
ff[j][c-'a'+1]++;
}
}
if(da == title[j].da){
grade[i] += title[j].grade;
}else if(!flag){
grade[i] += title[j].grade*1.0/2;
}
getchar();
getchar();
}
}
for(int i=0; i<n; i++){
printf("%.1f\n", grade[i]);
}
int maxn = -1;
for(int i=1; i<=m; i++){
for(int j=1; j<=5; j++){
if(ff[i][j] > maxn){
maxn = ff[i][j];
}
}
}
if(maxn == 0){
printf("Too simple");
return 0;
}
for(int i=1; i<=m; i++){
for(int j=1; j<=5; j++){
if(ff[i][j] == maxn){
printf("%d %d-%c\n", maxn, i, 'a'+j-1);
}
}
}
return 0;
}