下面是老实人做法,做完才想起来一个更简便的方法。
如果怕书名,人名或是其他的重名,在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);
}
}
}
}