#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