Java实现,具体思路看代码,会有解释。本题就是题目稍微冗长,认真对照测试示例看还是很容易看懂的。

import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner scan = new Scanner(System.in);
        while(scan.hasNext()) {
            //记录序列I个数以及存储序列I的元素
            int numbers_I = scan.nextInt();
            int[] array_I = new int[numbers_I];
            for(int i = 0; i < numbers_I; i++){
                array_I[i] = scan.nextInt();
            }
            //记录序列R个数以及存储序列R的元素
            int numbers_R = scan.nextInt();
            int[] array_R = new int[numbers_R];
            for(int i = 0; i < numbers_R; i++){
                array_R[i] = scan.nextInt();
            }
            //对序列R排序
            Arrays.sort(array_R);
            //存储总的输出组,方便最后统一输出
            ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();
            //记录输出总数,也就是输出的第一个数
            int count = 0;
            //标记序列R中元素在序列I中出现的次数
            int[] count_R = new int[numbers_R];
            //记录序列R元素是否在序列I中出现,也是方便输出
            boolean[] judge_R = new boolean[numbers_R];
            //一次判断序列R中元素是否在I序列中出现,并动态记录相应信息
            for(int i = 0; i < numbers_R; i++) {
                //辅助记录序列R中某元素在序列I中出现次数,方便输出
                int countR=0;
                //如果R中出现重复,只判断第一个元素,后面重复的略过
                if(i - 1 >= 0 && array_R[i] == array_R[i-1]) {
                    continue;
                }else {
                    //用来存储当前序列R元素在I中出现的坐标,方便输出
                    ArrayList<Integer> list_store_index_I = new ArrayList<Integer>();
                    for(int j = 0; j < numbers_I; j++) {
                        //不能直接array_I[i].toString(),因为int是基本类型
                        //但可以用以下方式
                        String s =Integer.toString(array_I[j]);
                        if(s.contains(Integer.toString(array_R[i]))){
                            //这一步可能重复赋值了,但无伤大雅
                            judge_R[i] = true;
                            //记录在序列I中出现下标
                            list_store_index_I.add(j);
                            //因为输出是 下标+元素,故+2
                            count += 2;
                            //只统计序列R中某元素在序列I中出现次数,故只用++
                            countR++;
                        }
                    }
                    if(!list_store_index_I.isEmpty()) {
                        list.add(list_store_index_I);
                        //这里不是count++,也应该是count+=2,因为是原数+个数
                        count += 2;
                        //标记序列R中某元素在序列I中出现的次数
                        count_R[i] = countR;
                    }
                }
            }
            //如果无满足条件I,则输出0即可
            if(list.isEmpty()) {
                System.out.print(0);
            }else{
                System.out.print(count + " ");
                int printlist_index = 0;
                for(int i = 0; i < numbers_R; i++) {
                    if(judge_R[i] == true) {
                        System.out.print(array_R[i] + " " + count_R[i] + " ");
                        ArrayList<Integer> outlist = new ArrayList<Integer>();
                        outlist = list.get(printlist_index);
                            for(int j = 0; j < outlist.size(); j++) {
                                System.out.print(outlist.get(j) + " " + array_I[outlist.get(j)]+" ");
                            }
                        printlist_index++;
                    }
                }
            }
            //记得换行,因为有可能有多组输入
            System.out.println();
        }

    }

}