#include <stdio.h> #include <stdlib.h> // 比较函数,用于 qsort int compare(const void* a, const void* b) { return *(int*)a - *(int*)b; } // 判断数字 i 是否连续包含数字 j int contains(int i, int j) { // 比如I是123,R是0 if (i < j) return 0; // 如果123 < 0, 证明没有包含关系 int tempI = i; int tempJ = j; if (tempJ == 0) { while (tempI / 10 != 0) { if (tempI % 10 == 0) return 1; else tempI /= 10; } return 0; } else { while (tempJ > 0 && tempI > 0) { if (tempI % 10 == tempJ % 10) { // printf("%d contains %d's last digit\n", tempI, tempJ); while(tempI % 10 == tempJ % 10){ tempI /= 10; tempJ /= 10; if(tempJ == 0) { return 1; } if(tempI % 10 != tempJ % 10){ tempJ = j; break; } } } else { tempI /= 10; } } } return tempJ == 0; } int main() { int I[101]; int R[101]; int numOfI, numOfR; scanf("%d", &numOfI); for (int i = 0; i < numOfI; i++) { scanf("%d", &I[i]); } //test // for (int i = 0; i < numOfI; i++) { // printf("%d\n", I[i]); // } scanf("%d", &numOfR); for (int i = 0; i < numOfR; i++) { scanf("%d", &R[i]); } //test // for (int i = 0; i < numOfR; i++) { // printf("%d\n", R[i]); // } // 使用 qsort 对 R 进行排序 qsort(R, numOfR, sizeof(int), compare); //test // for (int i = 0; i < numOfR; i++) { // printf("%d\n", R[i]); // } // 去重并更新 numOfR int newR[numOfR + 1]; int newNumOfR = 0; for (int i = 0; i < numOfR; i++) { if (R[i] == R[i + 1]) { // 如果后面的数字和这个数字相同,我们需要跳过相同的数字 newR[newNumOfR++] = R[i]; while (R[i] == R[i + 1]) { //直到遇到下一个新的数字我们停止 i++; } } else { newR[newNumOfR++] = R[i]; } } numOfR = newNumOfR; //test // for (int i = 0; i < numOfR; i++) { // printf("%d\n", newR[i]); // } // 一个是满足条件的I的个数,一个是满足条件的I的索引 int qualifyI[numOfR]; int indexOfI[numOfR][100]; for (int i = 0; i < numOfR; i++) { qualifyI[i] = 0; } int total = 0; for (int i = 0; i < numOfR; i++) { for (int j = 0; j < numOfI; j++) { if (contains(I[j], newR[i])) { // printf("find %d contains %d\n", I[j], newR[i]); // int foundDuplicate = 0; // for (int k = 0; k < qualifyI[i]; k++) { // if (I[indexOfI[i][k]] == I[j]) { // foundDuplicate = 1; // break; // } // } // if (!foundDuplicate) { indexOfI[i][qualifyI[i]++] = j; // } } } if (qualifyI[i] != 0) { total += 2 * qualifyI[i] + 2; } } printf("%d ", total); for (int i = 0; i < numOfR; i++) { if (qualifyI[i] > 0) { printf("%d ", newR[i]); printf("%d ", qualifyI[i]); for (int j = 0; j < qualifyI[i]; j++) { printf("%d ", indexOfI[i][j]); printf("%d ", I[indexOfI[i][j]]); } } } printf("\n"); return 0; }