哇,这道题思路其实很简单,但是,实现起来还是要有点功夫,我写了大概1个半小时,还是菜了点。

解题的核心在于以下几点

1.使用set函数对R数组进行排序和去重

2.怎样确定R数组中的整数元素在L数组中,我采取的办法是将数组元素全部转换成string类型。使用find函数可以快速判定一个串是否是另一个串的子串。注意这里有个坑点:find函数返回的是一个数,表示的意思是这个子串在主串的第一个下标位置,因此这个返回值可以是0~k的一个整数。如果找不到,则返回的是一个无穷大的值,一定要注意判别。

3.是样例中的30怎么来。我一开始做,算了半天都是26,这是因为忽略了对于的R元素的值和L数组中包含R元素的个数。所以应该是26+2*2=30,也就是代码中的count*2 + all.size()*2

#include <bits/stdc++.h>
using namespace std;

//记录位置和数值
struct positonandvalue {
    int index;
    int value;
    positonandvalue(int _index, int _value) {
        index = _index;
        value = _value;
    }
};

//判断a字符是否在b串里边
bool findainB(string b, string a) {
    if(b.find(a) >= 0 && b.find(a) <= 9) {
        return true;
    }
    else {
        return false;
    }
}

//数据分类处理
void dealasTypes(vector<int> L, set<int> setR) {
    vector<vector<positonandvalue> > all;
    vector<int> r;// 记录r的值
    int count = 0;

    for(auto it = setR.begin(); it != setR.end(); it++) {
        int flag = 0;
        vector<positonandvalue> nums;// 每一次要重新申明
        for(int i = 0; i < L.size(); i++) {
            if(findainB(to_string(L[i]), to_string((*it)))) {
                flag = 1;
                positonandvalue temp = positonandvalue(i, L[i]);
                nums.push_back(temp);
                count++;
            }
        }
        if(flag == 1) {
            all.push_back(nums);
            r.push_back(*it);
        }
    }
    //输出的总数目
    cout << count*2 + all.size()*2 << " ";
    for(int j = 0; j < all.size(); j++) {
        cout << r[j] << " " << all[j].size() << " ";
        for(int k = 0; k < all[j].size(); k++) {
            cout << all[j][k].index << " " << all[j][k].value<< " ";
        }
    }
    cout <<endl;
}

int main()
{
    //输入R和L
    int a,b;
    int m,n;
    cin >> a;
    vector<int> L(a);
    for(int i = 0; i < a; i++) {
        cin >> m;
        L[i] = m;
    }
    cin >> b;
    set<int> setR;
    for(int i = 0; i < b; i++) {
        cin >> n;
        setR.insert(n);
    }
    //Go
    dealasTypes(L, setR);
    return 0;
}