题解 | #数据分类处理#

数据分类处理

https://www.nowcoder.com/practice/9a763ed59c7243bd8ab706b2da52b7fd

#include <iostream>
#include <map>
#include <vector>
#include <algorithm>

using namespace std;
map<int,int> GetNumMap(int num)
{
    map<int,int> mapTmp;
    string snum = std::to_string(num);
    for (int i = 0; i <snum.length(); i++){
        for (int j = 1; j <= snum.length() - i; j++){
            int tmp = std::stoi(snum.substr(i, j));
            mapTmp.insert(pair<int,int>(tmp,1));
        }
    }
    return mapTmp;
}

int main() {
    map<int, int>hashMap; //第一个是索引i,第二个是数字num

    int num, n = 0, m = 0;
    //I
    cin >> n;
    int i = 0;
    while (n--){
        cin >> num;
        hashMap.insert(pair<int,int> (i++, num));
    }

    //R, 需要从小到大 去重排序
    vector<int> vec;
    cin >> m;
    while (m--){
        cin >> num;
        vec.push_back(num);
    }
    for (int i = 0; i < vec.size(); i++){
        for (int j = i + 1; j < vec.size(); j++){
            if (vec[i] > vec[j]){
                swap(vec[i], vec[j]);
            }
            else if (vec[i] == vec[j]){ 
                vec.erase(vec.begin() + j--);
            }
        }
    } 
    //输出 = 总数目 + 
    //       min(R<i>)&&存在I + num (包含R<i>的I的数目) + 索引 (满足条件的I序列中的位置索引) + I
    //       次小...
    //       max(...
    //总数目 = 2*符合条件的R<i>数目 (R<i>和num) + 2 * 叠加num (索引和I)
    int allnum = 0;
    int cnt= 0;
    typedef  pair<int, int> T;
    vector<T> v_all, v_after;
    for (int i = 0; i < vec.size(); i++){
        cnt = 0;
        v_after.clear();
        for (auto it = hashMap.begin(); it != hashMap.end(); it++){
            //将I的map的每个数字,拆分存储到另一个map中;
            map<int,int> mapTmp = GetNumMap(it->second);
            auto it1 = mapTmp.find(vec[i]);
            if (it1 != mapTmp.end())
            { 
                v_after.push_back(make_pair(it->first,it->second)); //索引,I
                cnt++;
            }
        }
        if (cnt != 0){
            v_all.push_back(make_pair(vec[i],cnt));
            sort(v_after.begin(), v_after.end()); //索引从小到大排序
            v_all.insert(v_all.end(), v_after.begin(), v_after.end());
            allnum += 2*cnt + 2;
        }
    }
 
    cout << allnum << " ";
    for (int i = 0; i < v_all.size(); i++){
        cout << v_all[i].first << " " << v_all[i].second << " ";
    }
    cout << endl;

}

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务