题解 | #数据分类处理#
数据分类处理
https://www.nowcoder.com/practice/9a763ed59c7243bd8ab706b2da52b7fd
#include<iostream> #include<algorithm> #include<sstream> #include <string> using namespace std; int I, R; int I_ARRY[101], R_ARRY[102]; //R多设置一个队尾 int num_changeto_string(string a) { int digit; stringstream ss; ss << a; ss >> digit; return digit; } int panduan_helper(string a, string b) { if (a.length() < b.length()) { return 0; } int j = 0; int ans = 0; int flag = 0; for (int i = 0; i < a.length(); i++) { if (a[i] == b[j]) { flag = 1; j++; ans++; } else { if (flag ==1 ) { i = i - ans; //这里a的指针回退,需要回退已经匹配了的长度 j = 0; ans = 0; } else { j = 0; ans = 0; } flag = 0; } if (ans == b.length()) { return 1; } } return 0; } struct ansnode { //构建一个结构,用于保存 int num; int index[100]; int I_num[100]; }; ansnode panduan(int k) { ansnode ANS; ANS.num = 0; //满足条件判断 string s = to_string(k); for (int i = 1; i <= I; i++) { string ss = to_string(I_ARRY[i]); if (panduan_helper(ss, s) == 1) { ANS.index[ANS.num] = i - 1; ANS.I_num[ANS.num] = I_ARRY[i]; ANS.num++; } } return ANS; } int main() { ansnode ans_fin[100]; int R_num[100]; int ans_fin_num = 0; cin >> I; I_ARRY[0] = I; for (int i = 1; i <= I; i++) { cin >> I_ARRY[i]; } cin >> R; R_ARRY[0] = R; cin >> R_ARRY[1]; int RK = 0; for (int i = 2; i <= R; i++) { //输入数据的同时用插入法排序 cin >> RK; int loc = i; for (int j = 1; j < i; j++) { if (R_ARRY[j] > RK) { loc = j; break; } } for (int j = i; j > loc; j--) { R_ARRY[j] = R_ARRY[j - 1]; } R_ARRY[loc] = RK; } R_ARRY[R + 1] = -1; //添加一个队尾数字,这个数字保证一定于前面的都不同 int total_num = 0; for (int i = 1; i <= R; i++) { if (R_ARRY[i] != R_ARRY[i + 1]) { //因为添加了一个队尾元素,所以每个元素都和其后一个元素比较,即可,如果没有添加队尾,按照我的比较思路就需要考虑1,2,2这种情况,只会输出1的结果 ansnode ans = panduan(R_ARRY[i]); if (ans.num != 0) { ans_fin[ans_fin_num] = ans; R_num[ans_fin_num] = R_ARRY[i]; ans_fin_num++; total_num = total_num + 2 + ans.num * 2; } } } cout << total_num << " "; for (int i = 0; i < ans_fin_num; i++) { cout << R_num[i] << " " << ans_fin[i].num << " "; for (int j = 0; j < ans_fin[i].num; j++) { cout << ans_fin[i].index[j] << " " << ans_fin[i].I_num[j] << " "; } } return 0; } // 64 位输出请用 printf("%lld")