#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