pat1022Digital Library (30)

来源:互联网 发布:国际数据分析师 编辑:程序博客网 时间:2024/04/29 07:41

题意分析:

(1)给出若干条书籍信息:按照书名、作者、关键字、出版商、出版年份的格式列出;再给出若干条检索记录,这些检索记录是围绕书名、作者、关键字、出版社以及年份,来按顺序列出查询的书的ID,考察的是排序和查找。

(2)将书的信息包装成结构体,在这些结构体当中,比较容易检索的包括书名、作者、出版社、出版年份;而对于关键字来说,由于每本书最多会有5个关键字,书的数目比较大时,如果将关键字向量或数组维护在结构体当中,每次都分别检索,检索的效率就可又能降低;因此聪明的大家也可能想到了将关键字分离出来,单独处理,按关键字的检索使用map效率会很高,而同一个关键字有可能会检索到多本书籍,所以map按关键字检索到的应该是一个书籍ID的向量

(3)也可以将书籍的各信息分开存储到map当中,但是这样又引来另外一个问题,那就是需要对每一项查询记录结果排序,额外增加了负担;这里就体现出了包装结构体的优势:只需要排序一次

可能坑点:

(1)将关键字也维护在结构体当中,导致检索超时

#include <iostream>#include <algorithm>#include <string.h>#include <sstream>#include <map>#include <vector>#include <stdio.h>using namespace std;struct bookInfo{    string ID;    string title;    string author;    string publisher;    string year;};bookInfo book[10001];map<string,vector<string> >keymap;bool cmp(bookInfo a,bookInfo b){    return a.ID<b.ID;}int main(){    int N,i=0;    cin>>N;    string keyword,temp;    while(i<N)    {        cin>>book[i].ID;        getchar();        getline(cin,book[i].title,'\n');        getline(cin,book[i].author,'\n');        getline(cin,keyword,'\n');        istringstream is(keyword);        while(is>>temp)keymap[temp].push_back(book[i].ID);        getline(cin,book[i].publisher,'\n');        getline(cin,book[i].year,'\n');        i++;    }    sort(&book[0],&book[N],cmp);    int M;    cin>>M;    int j=0;    int index;    string query;    int flag;    while(j<M)    {        flag=0;        scanf("%d: ",&index);        getline(cin,query,'\n');        cout<<index<<": "<<query<<endl;        if(index==1)        {            for(int k=0;k<N;k++)            {                if(book[k].title==query)                {                    flag=1;                    cout<<book[k].ID<<endl;                }            }        }        else if(index==2)        {            for(int k=0;k<N;k++)            {                if(book[k].author==query)                {                    flag=1;                    cout<<book[k].ID<<endl;                }            }        }        else if(index==3)        {            sort(keymap[query].begin(),keymap[query].end());            if(keymap[query].size()>0)            {                flag=1;                vector<string >::iterator iter=keymap[query].begin();                for(;iter!=keymap[query].end();iter++)                {                    cout<<*iter<<endl;                }            }        }        else if(index==4)        {            for(int k=0;k<N;k++)            {                if(book[k].publisher==query)                {                    flag=1;                    cout<<book[k].ID<<endl;                }            }        }        else        {            for(int k=0;k<N;k++)            {                if(book[k].year==query)                {                    flag=1;                    cout<<book[k].ID<<endl;                }            }        }        if(flag==0)cout<<"Not Found"<<endl;        j++;    }    return 0;}


0 0
原创粉丝点击