PATA1022_STL(难度:⭐️⭐️)

下面是老实人做法,做完才想起来一个更简便的方法。

如果怕书名,人名或是其他的重名,在map映射的时候再前面 + "num" (1 ~ 5),这样就保证不会冲突,而且只用一个map会简洁很多。用map<string, set<int>>。然而这个题并没有毁重复的情况。。。

下面是简短代码


#include<bits/stdc++.h>
using namespace std;
unordered_map<string, set<int>> mp;
void Key (string s, int id) {
    while(s.find(" ") != -1){
        string temp = s.substr(0, s.find(" "));
        s = s.substr(s.find(" ") + 1);
        mp[temp].insert(id);
    }
    mp[s].insert(id);
}
int main() {
    int n, m, id, a;
    string s1, s2, s3, s4, s5, s;
    scanf ("%d", &n);
    for (int i = 0; i < n; i++) {
        cin >> id;
        getchar();
        for (int j = 1; j <= 5; j++) {
            getline (cin, s);
            if (j == 3) Key(s, id);
            else mp[s].insert(id);
        }
    }
    scanf ("%d", &m);
    for (int i = 0; i < m; i++) {
        scanf ("%d: ", &a);
        getline (cin, s);
        printf ("%d: %s\n", a, s.c_str());
        if (mp[s].size() == 0) {
            printf ("Not Found\n");
            continue;
        }
        for (auto it : mp[s]) {
            printf ("%07d\n", it);
        }
    }
}

下面是憨憨代码:


#include<bits/stdc++.h>
using namespace std;
unordered_map<string, vector<int>> m1, m2, m3, m4, m5;
void Key (string s, int id) {
    while(s.find(" ") != -1){
        string temp = s.substr(0, s.find(" "));
        s = s.substr(s.find(" ") + 1);
        m3[temp].push_back(id);
    }
    m3[s].push_back(id);
}
int main() {
    int n, m, id, a;
    string s1, s2, s3, s4, s5, s;
    scanf ("%d", &n);
    for (int i = 0; i < n; i++) {
        cin >> id;
        getchar();
        getline (cin, s1);
        getline (cin, s2);
        getline (cin, s3);
        Key(s3, id);
        getline (cin, s4);
        getline (cin, s5);
        m1[s1].push_back(id); m2[s2].push_back(id); m4[s4].push_back(id); m5[s5].push_back(id);
    }
    scanf ("%d", &m);
    for (int i = 0; i < m; i++) {
        scanf ("%d: ", &a);
        getline (cin, s);
        printf ("%d: %s\n", a, s.c_str());
        if (a == 1) {
            if (m1[s].size() == 0) {
                printf ("Not Found\n");
                continue;
            }
            sort (m1[s].begin(), m1[s].end());
            for (auto it : m1[s]) {
                printf ("%07d\n", it);
            }
        }
        if (a == 2) {
            if (m2[s].size() == 0) {
                printf ("Not Found\n");
                continue;
            }
            sort (m2[s].begin(), m2[s].end());
            for (auto it : m2[s]) {
                printf ("%07d\n", it);
            }
        }
        if (a == 3) {
            if (m3[s].size() == 0) {
                printf ("Not Found\n");
                continue;
            }
            sort (m3[s].begin(), m3[s].end());
            for (auto it : m3[s]) {
                printf ("%07d\n", it);
            }
        }
        if (a == 4) {
            if (m4[s].size() == 0) {
                printf ("Not Found\n");
                continue;
            }
            sort (m4[s].begin(), m4[s].end());
            for (auto it : m4[s]) {
                printf ("%07d\n", it);
            }
        }
        if (a == 5) {
            if (m5[s].size() == 0) {
                printf ("Not Found\n");
                continue;
            }
            sort (m5[s].begin(), m5[s].end());
            for (auto it : m5[s]) {
                printf ("%07d\n", it);
            }
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值