[PAT解题报告] Digital Library

不是难题。其实就是按照name, title, publisher, key word和year建立倒排索引就行了。具体倒排索引可以用map<string, set<string> > 代替。key就是那5种类型,value是符合要求的书的集合。题目一点也不难,可以算做模拟题,就是问什么,从倒排索引里把要的东西拿出来输出就可以了。
注意事项: 别忘了输出query……

代码:
#include <cstdio>
#include <map>
#include <string>
#include <cstring>
#include <sstream>
#include <set>

using namespace std;

map<string, set<string> > title, author,word, publisher, year;

char s[1000];

void make(map<string,set<string> > &a, const char *s) {
map<string,set<string> >::iterator t = a.find(s);
    if ((t == a.end()) || (t->second.empty())) {
        puts("Not Found");
    }
    else {
        for (set<string>::iterator it = t->second.begin(); it != t->second.end(); ++it) {
            puts(it->c_str());
        }
    }
}

int main() {
int n;
    scanf("%d",&n);
    for (gets(s);n;--n) {
        gets(s);
        string id = s;
        gets(s);
        title[s].insert(id);
        gets(s);
        author[s].insert(id);
        gets(s);
        istringstream in(s);
        string temp;
        while (in >> temp) {
            word[temp].insert(id);
        }
        gets(s);
        publisher[s].insert(id);
        gets(s);
        year[s].insert(id);
    }
    scanf("%d",&n);
    for (gets(s);n;--n) {
        gets(s);
        puts(s);
        switch(s[0]) {
        case '1':
            make(title, s + 3);
            break;
        case '2':
            make(author, s + 3);
            break;
        case '3':
            make(word, s + 3);
            break;
        case '4':
            make(publisher, s + 3);
            break;
        case '5':
            make(year, s + 3);
            break;
        }
    }
    return 0;
}
原题链接: http://www.patest.cn/contests/pat-a-practise/1022
全部评论
虽然想法一模一样,,但是楼上写的代码就是比我写的简洁,好看。在输入处理,和输出时。
点赞 回复 分享
发布于 2015-10-28 21:01

相关推荐

点赞 评论 收藏
分享
在评审的大师兄很完美:像这种一般就是部门不匹配 转移至其他部门然后挂掉 我就是这样被挂了
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务