#include <iostream>
using namespace std;
#include <map>
#include <string>
#include <vector>
int main() {
int numI;//I输入计数
int numR;//R输入计数
int numOut = 0;//输出计数blank
string str;
map<int, string>
mapI; //储存I信息的map,其int为数组下标,string为其数字的字符串
map<int, string>
mapR; //储存R信息的map,其int和string都为其值,用于自动排序和去重
getline(cin, str, ' ');
numI = stoi(str);
for (int i = 0; i < numI ; i++) {
if (i != numI - 1 ) {
getline(cin, str, ' ');
} else {
getline(cin, str, '\n');
}
mapI[i] = str;
}
getline(cin, str, ' ');
numR = stoi(str);
int r;
for (int i = 0; i < numR; i++) {
if (i != numR - 1 ) {
getline(cin, str, ' ');
} else {
getline(cin, str, '\n');
}
r = stoi(str);
if (mapR.count(r) == 0) {
mapR[r] = str;
}
}
map<int, map<int, string>> resMap;
map<int, string> resI;
for (auto& itR : mapR) {
resI.clear();
for (auto& itI : mapI) {
if ((itI.second).find(itR.second) != -1) {
//当子串查找成立时
resI.insert(pair<int, string>(itI.first, itI.second));
}
}
resMap.insert(pair<int, map<int, string>>(itR.first, resI));
if (!resI.empty()) {
numOut = numOut + 2 + resI.size() * 2;
}
}
cout << numOut << ' ';
for (auto& itRes : resMap) {
if (!itRes.second.empty()) {
cout << itRes.first << ' ';
cout << itRes.second.size() << ' ';
for (auto& itResI : itRes.second) {
cout << itResI.first << ' ' << itResI.second << ' ';
}
}
}
}
用好数据结构,这题其实不难,要认真看清题目。
利用map的特性来对R的数据进行自动排序和去重,利用string的find函数查找子串。
要注意的是,输入这次是分2行的,做好换行符的读取,否则会出现一些bug

京公网安备 11010502036488号