题解 | #数据分类处理#
数据分类处理
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; }