题目大意:给一些需要忽视的单词和一些标题,除了这些需要忽视的单词外,剩下的单词都是关键词。根据关键词排序,输出标题。多个关键词则输出多次,输出时关键词大写,其余字母小写。
解题思路:用一个结构题储存每个单词和对应的标题(转换好大小写),按照单词顺序排序后输出,输出时检测单词是否时需要忽视的单词,是则不输出。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<ctype.h>
using namespace std;
struct words {
char key[20];
char tit[10010];
} w[10010];
char ignore[100][20];
char title[500][10010];
int cmp(const void*a, const void*b) {
return strcmp((char*)a, (char*)b);
}
int main() {
int ig = 0, ti = 0, ky = 0;
scanf("%s", ignore[ig]);
for (ig = 1; strcmp(ignore[ig-1], "::") != 0; ig++)
scanf("%s", ignore[ig]);
ig--;
getchar();
while (gets(title[ti]) != NULL) {
for (int i = 0; title[ti][i] != '\0'; i++) {
if (title[ti][i] >= 'A' && title[ti][i] <= 'Z')
title[ti][i] = title[ti][i] - 'A' + 'a';
}
int i, j = 0;
for (i = 0; title[ti][i] != '\0'; i++) {
if (title[ti][i] == ' ') {
w[ky].key[j] = '\0';
strcpy(w[ky].tit, title[ti]);
for (int flag = i - strlen(w[ky].key); flag < i; flag++)
w[ky].tit[flag] = w[ky].tit[flag] - 'a' + 'A';
ky++;
i++;
j = 0;
}
w[ky].key[j++] = title[ti][i];
}
w[ky].key[j] = '\0';
strcpy(w[ky].tit, title[ti]);
for (int flag = i - strlen(w[ky].key); flag < i; flag++)
w[ky].tit[flag] = w[ky].tit[flag] - 'a' + 'A';
ky++;
ti++;
}
qsort(w, ky, sizeof(w[0]), cmp);
for (int i = 0; i < ky; i++) {
int flag = 1;
for (int j = 0; j < ig; j++)
if (strcmp(w[i].key, ignore[j]) == 0) {
flag = 0; break;
}
if (flag) puts(w[i].tit);
}
return 0;
}