PAT A1022 Digital Library (30 分) 字符串

    题目大意:给出N本书的信息,包括标题、作者、关键字等等,要求根据查询的关键字输出对应的书的id。

    没什么算法思想,信息和id之间的对应用map即可,主要问题在①同一个信息可能对应多本书,因此可以用set或者vector来存储书的信息,即map<string, set<string>>或map<string, vector<string>>,实测两种写法耗时差不多。②关键字的处理,关键字是用空格分开的,因此要正确得到每个关键字,先在整行之后加上一个空格,然后依次查找空格的位置并处理关键字。

AC代码如下:

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <set>
#include <map>


using namespace std;

map<string, set<string>> mp[5];

int main()
{
    int N;
    scanf("%d\n", &N);
    for (int i = 0; i < N; ++i)
    {
        string id, title, author, keyWords, publisher, year;
        getline(cin, id);
        getline(cin, title);
        getline(cin, author);
        getline(cin, keyWords);
        getline(cin, publisher);
        getline(cin, year);
        mp[0][title].insert(id);
        mp[1][author].insert(id);
        mp[3][publisher].insert(id);
        mp[4][year].insert(id);
        keyWords += " ";
        while(keyWords.find(" ") != string::npos)
        {
            int pos = keyWords.find(" ");
            mp[2][keyWords.substr(0, pos)].insert(id);
            keyWords.erase(keyWords.begin(), keyWords.begin() + pos + 1);
        }
    }
    int K;
    scanf("%d\n", &K);
    for (int query = 0; query < K; ++query)
    {
        string str;
        getline(cin, str);
        printf("%s\n", str.c_str());
        int q = str[0] - '0' - 1;
        str.erase(str.begin(), str.begin() + 3);
        if(mp[q].find(str) != mp[q].end())
        {
            for(set<string>::iterator it = mp[q][str].begin(); it != mp[q][str].end(); it++)
                printf("%s\n", (*it).c_str());
        }
        else printf("Not Found\n");
    }
    return 0;
}


 

上一篇:为什么在C中读取stdin的行比Python慢​​得多?


下一篇:cin.getline()和getline()函数