UVa 123 - Searching Quickly解题报告

来源:互联网 发布:软件著作权和知识产权 编辑:程序博客网 时间:2024/05/02 04:31

题意:给出一系列要忽略的单词,这些单词以外的单词都看作关键字。然后给出一些标题,找出标题中所有的关键字,然后按这些关键字的字典序给标题排序。

思路:用结构数组存储关键字和它在title中位置,最后按位置来将它大写。

做这道题时,因为数组开小了一直wrong,一直以为数组开小只会runtime error,没想到居然不会越界,于是一直没有去考虑数组开小了的问题。纠结了四个小时。才发现这个问题。很蛋疼。

#include <iostream>#include <cstring>#include <cstdlib>#include <cctype>using namespace std;struct pchar{int x, y;char str[50];};pchar words[50], keywords[3000];//数组开小了,结果一直wrongchar  wti[60][50], titles[200][200];int getwords(char *, int);//int cmp_string(const void *_a, const void *_b){pchar *a = (pchar*)_a;pchar *b = (pchar*)_b;if(strcmp(a->str, b->str) != 0)return strcmp(a->str, b->str);elseif(a->x != b->x)return a->x - b->x;elsereturn a->y - b->y;}int main(){//freopen("data.txt", "r", stdin);//freopen("output.txt", "w", stdout);int nwti = 0, ntitle = 0;for(int i = 0; scanf("%s", wti[i]); i++, nwti++)//录入wtiif(wti[i][0] == ':'){wti[i][0] = '\0';break;}getchar();for(int i = 0; cin.getline(titles[i], 200); i++)//录入title{ntitle++;if(titles[i][0] == '\0')//跳过空白行ntitle--, i--;}for(int i = 0; i < ntitle; i++)for(int j = 0; j < strlen(titles[i]); j++)if(isalpha(titles[i][j]))titles[i][j] = tolower(titles[i][j]);int m = 0;for(int i = 0; i < ntitle; i++)//提取keyword{int n = getwords(titles[i], i);for(int j = 0; j < n; j++){int flag = 1;for(int k = 0; k < nwti; k++)if(strcmp(words[j].str, wti[k]) == 0){flag = 0;break;}if(flag){strcpy(keywords[m].str, words[j].str);keywords[m].x = words[j].x;keywords[m].y = words[j].y - strlen(words[j].str) + 1;//得到keyword在第一个字母在原字符串中的位置m++;}}}qsort(keywords, m, sizeof(keywords[0]), cmp_string);//排序for(int i = 0; i < m; i++){int flag = 0;for(int j = 0; titles[keywords[i].x][j] != '\0'; j++){if(j == keywords[i].y)flag = 1;if(!isalpha(titles[keywords[i].x][j]))flag = 0;if(flag == 1)printf("%c", toupper(titles[keywords[i].x][j]));elseprintf("%c", titles[keywords[i].x][j]);}printf("\n");}return 0;}int getwords(char * a, int x){memset(words, 0, sizeof(words));int n = 0, m = 0;for(int i = 0; i < strlen(a); i++)if(isalpha(a[i])){words[n].str[m++] = tolower(a[i]);//words[n].x = x;//x存储单词在哪个title中words[n].y = i;//y存储单词在字符串中最后一个字母的位置}else if(isalpha(a[i + 1]))n++, m = 0;return n + 1;}


0 0