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