import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.*; class Main { public static void main(String[] args) throws IOException { // 处理IO输入 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int[] line = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray(); int n = line[0]; int m = line[1]; int[][] matrix = new int[n][m]; for (int i = 0; i < n; ++i) matrix[i] = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray(); br.readLine(); int[] arrK = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray(); // 统计矩阵matrix每一列数字出现次数 List<Map<Integer, Integer>> columnList = new ArrayList<>(); for (int j = 0; j < m; ++j) { Map<Integer, Integer> cntEachColumn = new HashMap<>(); for (int i = 0; i < n; ++i) { cntEachColumn.put(matrix[i][j], cntEachColumn.getOrDefault(matrix[i][j], 0) + 1); } columnList.add(cntEachColumn); } // 统计数组k中每个数字出现次数 Map<Integer, Integer> cntK = new HashMap<>(); for (int num : arrK) cntK.put(num, cntK.getOrDefault(num, 0) + 1); // 滑动窗口 int ans = Integer.MAX_VALUE; Map<Integer, Integer> variableMap = new HashMap<>(); // 变量map动态统计次数 for (int l = 0, r = 0; r < m; ++r) { Map<Integer, Integer> right = columnList.get(r); addMap(variableMap, right); // 添加右列 while (l <= r && isAllContains(variableMap, cntK)) { ans = Math.min(ans, r - l + 1); // 记录最小值 Map<Integer, Integer> left = columnList.get(l); delMap(variableMap, left); // 删除左列 l++; } } // 输出结果 System.out.println(ans == Integer.MAX_VALUE ? -1 : ans); } /** * 比较 变量map中的数字个数 和 常量map中的数字个数 * * @param variableMap 变量map * @param constantMap 常量map * @return 变量map中的数字个数 是否大于等于 常量map中的数字个数 */ private static boolean isAllContains(Map<Integer, Integer> variableMap, Map<Integer, Integer> constantMap) { for (Map.Entry<Integer, Integer> kEntry : constantMap.entrySet()) { int kNum = kEntry.getKey(); int kCnt = kEntry.getValue(); if (!variableMap.containsKey(kNum) || variableMap.get(kNum) < kCnt) return false; } return true; } /** * 将 当前列map 加入 变量map中 * * @param variableMap 变量map * @param curMap 当前列map */ private static void addMap(Map<Integer, Integer> variableMap, Map<Integer, Integer> curMap) { for (Map.Entry<Integer, Integer> curEntry : curMap.entrySet()) { int curNum = curEntry.getKey(); int curCnt = curEntry.getValue(); variableMap.put(curNum, variableMap.getOrDefault(curNum, 0) + curCnt); } } /** * 将 当前列map 从 变量map中 移除 * * @param variableMap 变量map * @param curMap 当前列map */ private static void delMap(Map<Integer, Integer> variableMap, Map<Integer, Integer> curMap) { for (Map.Entry<Integer, Integer> curEntry : curMap.entrySet()) { int curNum = curEntry.getKey(); int curCnt = curEntry.getValue(); if (variableMap.containsKey(curNum)) { variableMap.put(curNum, variableMap.get(curNum) - curCnt); if (variableMap.get(curNum) < 1) variableMap.remove(curNum); } } } }