/* 基本思路,因为记录的数据都跟规则相关,所以使用hash思想,将规则所在位置的下标作为hash分类依据 */
/*定义了个三位数组p 第3维代表规则所在下标,即p[i]就是存放符合规则R[i]的数量和数据,二维中的首位放的是规则条数即p[i][0][0]用来存放符合该规则的数量,p[i][1]开始存放符合规则的下标和数据值*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define LEN 100
#define STR_LEN 15
int main() {
long long I[LEN];
long long R[LEN];
long long p[LEN][LEN+1][2];
int numi;
int numr;
int relnumr = 0;
long long tmp;
int i,j;
char rstr[STR_LEN];
char istr[STR_LEN];
int index;
int total =0;
for (int i = 0; i < LEN; i++) {
I[i] = -1;
R[i] = -1;
}
scanf("%d", &numi);
for (int i = 0; i < numi; i++) {
scanf("%lld", &I[i]);
}
scanf("%d", &numr);
for ( i = 0; i < numr; i++) {
scanf("%lld", &tmp);
for ( j = 0; j < i; j++) {
if (tmp == R[j]) {
break;
}
}
/* 跳过重复数字*/
if (i != j && i != 0) {
continue;
}
R[relnumr] = tmp;
relnumr++;
}
/* 对规则进行排序*/
for (i = 0; i < relnumr; i++) {
for(j = i; j < relnumr; j++) {
if (R[i] > R[j]) {
tmp = R[i];
R[i] = R[j];
R[j] = tmp;
}
}
}
/* 将符合的数据和数量放入p中 */
memset(p, 0, sizeof(p));
for (i = 0; i < relnumr; i++) {
for (j =0; j < numi; j++) {
sprintf(istr, "%lld", I[j]);
sprintf(rstr, "%lld", R[i]);
if (strstr(istr, rstr)) {
index = p[i][0][0] + 1;
p[i][index][0] = j;
p[i][index][1] = I[j];
p[i][0][0]++;
}
}
}
/* 计算输出数量 */
for (i = 0; i < relnumr; i++) {
if (p[i][0][0] > 0) {
total++; /* 规则 */
total++; /* 规则条数 */
total += p[i][0][0] * 2;
}
}
printf("%d ", total);
for (i = 0; i < relnumr; i++) {
if (p[i][0][0] > 0) {
printf("%lld ", R[i]);
printf("%lld ", p[i][0][0]);
for (int k = 1; k < p[i][0][0] +1; k++) {
printf("%lld ", p[i][k][0]);
printf("%lld ", p[i][k][1]);
}
}
}
return 0;
}