UVa 123 Searching Quickly
来源:互联网 发布:九章算法班视频百度云 编辑:程序博客网 时间:2024/05/17 22:07
#include <iostream>#include <cstdio>#include <cstring>#include <string>#include <cctype>#include <cstdlib>using namespace std;struct key{ char keywords[100]; //关键字 int line; //所在行 int start; //行偏移位置};key keys[3000];int num_key = 0;char ignore[60][15];int num_ig = 0;char titles[250][300];int num_tit = 0;//qsort使用的比较函数int cmp_key(const void *a, const void *b) { key *_a = (key *)a; key *_b = (key *)b; int ret = strcmp(_a->keywords, _b->keywords); if(ret == 0) { if(_a->line == _b->line) { return _a->start - _b->start; } else { return _a->line - _b->line; } } else { return ret; }}// tilte转换为小写void titles_lower(){ for(int i=0; i<num_tit; i++) { char *p = titles[i]; while(*p) { *p = tolower(*p); p++; } }}// 判断关键字是否在ignore中bool in_ignore(const char *words) { for(int i=0; i<num_ig; i++) { if(strcmp(words, ignore[i]) == 0) return true; } return false;}int main(){ #ifndef ONLINE_JUDGE freopen("in.txt", "r", stdin); #endif while(gets(ignore[num_ig])) { if(ignore[num_ig][0] == ':') break; else num_ig++; } //for(int i=0; i<num_ig; i++) puts(ignore[i]); while(gets(titles[num_tit++])); titles_lower(); //for(int i=0; i<num_tit; i++) puts(titles[i]); key k; char *p; for(int i=0; i<num_tit; i++) { //获得keyword p = titles[i]; while(sscanf(p, "%s", k.keywords) == 1) { if(!in_ignore(k.keywords)) { k.line = i; k.start = p-titles[i]; keys[num_key++] = k; } p += strlen(k.keywords); while(*p == ' ') p++; //排除空格 } } qsort(keys, num_key, sizeof(key), cmp_key); // keyword排序 char buff[300]; for(int i=0; i<num_key; i++) { strcpy(buff, titles[keys[i].line]); p = buff + keys[i].start; char *q = p + strlen(keys[i].keywords); while(p<q) { *p = toupper(*p); p++; } puts(buff); } return 0;}