题目大意:
输入一系列要被忽视的单词和题目,题目中除了要被忽视的单词外其他的都是关键字。把关键字忽略大小写按字典序排序。再把题目按照关键字的字典序输出。有几个关键字输出几次(看题目中样例)。输出的时候那个关键字大写,其他都小写。
解题思路:
1、输入转换大小写提取关键字。
2、关键字排序。
3、在题目中搜索关键字。
4、按照关键字大写,其他小写输出。
反思:
1、刚开始因为看了篇博客导致先入为主,一直认识WA是gets的原因,然后一直修改gets和扩大数组。其实原因是Search_2()的p写成了m(居然还可以通过那么多数据)。给了之后用fgets交了下AC了,然后不死心又用gets交了下同样AC。感觉在uva上两者功能应该没区别。
2、uva上数组不能起名ignore,关键字重复吧,但是程序可以跑起来。
找出错误的样例:
a :: I am a Man I am a mAn I am a maN
i AM a ma i AM a ma i AM a ma I am a ma I am a ma I am a ma i am a MA i am a MA i am a MA
AC代码:
#define Local #include <iostream> #include <iomanip> #include <string> #include <cstring> #include <cstdio> #include <queue> #include <stack> #include <algorithm> #include <cmath> using namespace std; #define MAX 10000 + 10 char ign[50][20], title[MAX][MAX], keyword[MAX][MAX]; int m, n, p; //m记录忽略单词的个数,n记录标题的个数,p是关键字数 void Input() { char s[MAX]; while (fgets(s, MAX, stdin) != NULL) { s[strlen(s)-1] = ‘\0‘; if (‘:‘ == s[0]) break; strcpy(ign[m++], s); } while (fgets(s, MAX, stdin) != NULL) { s[strlen(s)-1] = ‘\0‘; strcpy(title[n++], s); } } void Strlwr() { int i = 0, j = 0; for (i = 0; i < n; i++) for (j = 0; j < strlen(title[i]); j++) if (title[i][j] >= ‘A‘ && title[i][j] <= ‘Z‘) title[i][j] += ‘a‘ - ‘A‘; } int Search_1(char s[]) { int i = 0; for (i = 0; i < m; i++)//存在 { if (!strcmp(s, ign[i])) return 0; } return 1; } int Search_2(char s[]) { int i = 0; for (i = 0; i < p; i++)//好奇怪这一直写成m居然还能通过那么多样例。//存在 { if (!strcmp(keyword[i], s)) return 0; } return 1; } void ExtractAndSearch(char s[], int num) { int i = 0, j = 0; char temp[20]; for (i = 0; i < strlen(s); i++) { j = 0; memset(temp, ‘\0‘, sizeof(temp)); while (‘ ‘ != s[i] && i < strlen(s)) { temp[j++] = s[i++]; } temp[j] = ‘\0‘; if (Search_1(temp) && Search_2(temp))//不存在的话 { strcpy(keyword[p], temp); p++; } } } int cmp(const void *a, const void *b) { return strcmp((char *)a, (char *)b); } void Output() { int i = 0, j = 0, k = 0, l = 0; for (i = 0; i < p; i++)//关键字的个数 { for (j = 0; j < n; j++)//标题的数【j写成i】又是致命错误 { char temp[20]; int pos_1 = 0, pos_2 = 0; for (k = 0; k < strlen(title[j]); k++) { l = 0; memset(temp, ‘\0‘, sizeof(temp)); pos_1 = k; while (‘ ‘ != title[j][k] && k < strlen(title[j])) { temp[l++] = title[j][k++]; } temp[l] = ‘\0‘; pos_2 = k; if (!strcmp(keyword[i], temp)) { for (l = pos_1; l < pos_2; l++) title[j][l] -= ‘a‘ - ‘A‘; puts(title[j]); for (l = pos_1; l < pos_2; l++) title[j][l] += ‘a‘ - ‘A‘; } } } } } int main() { #ifdef Local freopen("a.in", "r", stdin); freopen("a.out", "w", stdout); #endif int i = 0, j = 0; Input(); Strlwr(); for (i = 0; i < n; i++)//提取单词 并查找插入 { ExtractAndSearch(title[i], i); } qsort(keyword, p, sizeof(keyword[0]), cmp); Output(); }