1022 Digital Library (30分)

题目

分析

模拟题+搜索+string处理

输入一整行数据的方法:
string a;
getline(cin, a);
输入带空格的整行的方法:
while(cin >> tkey){
key[tkey].insert[id];
char c = getchar();
if (c == ‘\n’) break; ///终止条件,很重要
}

要点

  • 在query的时候要注意使用 & 别名,不然会导致时间浪费(复制数据会导致比较大的开销)
  • cin遇到空格 和 换行 都会停止输入,获取整行应该使用getline
  • 带排序的 —— 用set
  • 数据格式:07d

知识点

题解

#include <iostream>
#include <map>
#include <set>
using namespace std;
map<string, set<int> > title, author, key, pub, year; //使用map, 内存换时间
void query(map<string, set<int> > &m, string &str) { //检索map函数
    if(m.find(str) != m.end()) {
        for(auto it = m[str].begin(); it != m[str].end(); it++)
            printf("%07d\n", *it); //注意07d
    } else
        cout << "Not Found\n";
}
int main() {
    #ifndef ONLINE_JUDGE
    freopen("data.txt","r", stdin);
    #endif // ONLINE_JUDGE
    int n, m, id, num;
    scanf("%d", &n);
    string ttitle, tauthor, tkey, tpub, tyear; //
    for(int i = 0; i < n; i++) {
        scanf("%d\n", &id);    //获取id
        getline(cin, ttitle); //直接获取一整行
        title[ttitle].insert(id); //获取书名
        getline(cin, tauthor);
        author[tauthor].insert(id);
        while(cin >> tkey) { //直接输入, 知道遇到回车
            key[tkey].insert(id);
            char c = getchar();
            if(c == '\n') break;
        }
        getline(cin, tpub);
        pub[tpub].insert(id);
        getline(cin, tyear);
        year[tyear].insert(id);
    }
    scanf("%d", &m);
    for(int i = 0; i < m; i++) {
        scanf("%d: ", &num); //检索类型
        string temp;
        getline(cin, temp);
        cout << num << ": " << temp << "\n";
        if(num == 1) query(title, temp);
        else if(num == 2) query(author, temp);
        else if(num == 3) query(key, temp);
        else if(num == 4) query(pub,temp);
        else if(num ==5) query(year, temp);
    }
    return 0;
}

1022 Digital Library (30分)1022 Digital Library (30分) AzheCo 发布了25 篇原创文章 · 获赞 0 · 访问量 213 私信 关注
上一篇:(9)awk getline用法详解


下一篇:c++中的类c字符串