1. 暴露破解。。。纯粹的API调用工程师再次!!! 不过下面还是用到了很多处理方法的,利用stream流对Map进行取值、排序、去重。再根据TreeMap的特性来排序。也是有很多指的考量的地方的。
import java.util.*;
import java.util.stream.Collectors;

public class Main {

    // 构造内部类,用于记录
    private static class CountR{
        private Integer index;
        private String number;

        public CountR(Integer index, String number) {
            this.index = index;
            this.number = number;
        }

        public Integer getIndex() {
            return index;
        }

        public void setIndex(Integer index) {
            this.index = index;
        }

        public String getNumber() {
            return number;
        }

        public void setNumber(String number) {
            this.number = number;
        }
    }

    public static void main(String[] args){
        Scanner s = new Scanner(System.in);
        ArrayList<HashMap<Integer,String>> list = new ArrayList<>();
        while (s.hasNextLine()){
            String line = s.nextLine();
            if ("".equals(line)) break;
            String[] strings = line.split("\\s");
            HashMap<Integer,String> map = new HashMap<>();
            for (int i = 1; i < strings.length; i++) {
                map.put(i-1,strings[i]);
            }
            list.add(map);
        }
        HashMap<Integer,String> mapR = list.get(0);
        List<String> listL = list.get(1).entrySet().stream().map(Map.Entry::getValue).sorted().distinct().collect(Collectors.toList());

        TreeMap<Integer,List<CountR>> treeMap = new TreeMap<>();
        for (String str : listL) {
            List<Map.Entry<Integer, String>> entries = mapR.entrySet().stream().filter(e -> e.getValue().contains(str)).collect(Collectors.toList());
            List<CountR> countRS = new ArrayList<>();
            for (Map.Entry<Integer, String> entry : entries) {
                countRS.add(new CountR(entry.getKey(),entry.getValue()));
            }
            treeMap.put(Integer.valueOf(str),countRS);// 记录索引和数值
        }
        
        // 获取非空集合
        List<Map.Entry<Integer, List<CountR>>> resList = treeMap.entrySet().stream().filter(e -> e.getValue() != null && e.getValue().size() > 0).collect(Collectors.toList());
        StringBuilder resBuilder = new StringBuilder();
        int numCount = resList.size()*2;
        for (Map.Entry<Integer, List<CountR>> res : resList) {
            resBuilder.append(res.getKey()).append(" ");
            List<CountR> values = res.getValue();
            resBuilder.append(values.size()).append(" ");
            numCount += values.size()*2;
            for (CountR countR : values) {
                resBuilder.append(countR.getIndex()).append(" ").append(countR.getNumber()).append(" ");
            }
        }
        System.out.println(numCount+ " " + resBuilder.toString());
    }
}