AOAPC I: Beginning Algorithm Contests (Rujia Liu) :: Volume 1. Elementary Problem Solving ::String
// 409 - Excuses, Excuses!
#include <cstdio>
#include <cstring>
#include <cctype>
int main(void)
{
char *found, p, q;
int i, j, k, e, c, n, len, max, cnt=1, times[20];
char keyword[20][20], excuse[20][80], excuse_t[20][80];
while(scanf("%d%d", &k, &e) != EOF)
{
for(i = 0; i < k; i++)
scanf("%s", keyword[i]);
getchar();
for(i = 0; i < e; i++)
{
n = 0;
while((c=getchar())!='\n' && c!=EOF)
{
excuse[i][n] = c;
excuse_t[i][n] = tolower(c);
n++;
}
excuse[i][n] = '\0';
excuse_t[i][n] = '\0';
}
memset(times, 0, sizeof(times));
for(i = 0; i < e; i++)
{
for(j = 0; j < k; j++)
{
len = strlen(keyword[j]);
found = strstr(excuse_t[i], keyword[j]);
while(found != NULL)
{
if(found == excuse_t[i])
{
sscanf(found+len, "%c", &q);
if(!isalpha(q))
times[i]++;
}
else
{
sscanf(found-1, "%c", &p);
sscanf(found+len, "%c", &q);
if(!isalpha(p) && !isalpha(q))
times[i]++;
}
found = strstr(found+len, keyword[j]);
}
}
}
max = -1;
for(i = 0; i < e; i++)
if(times[i] > max)
max = times[i];
printf("Excuse Set #%d\n", cnt++);
for(i = 0; i < e; i++)
if(times[i] == max)
printf("%s\n", excuse[i]);
printf("\n");
}
return 0;
}