CCF-201803-3-URL映射
import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class Main { private static List<String> ans = new ArrayList<String>(); public static void main(String[] args) { Scanner in = new Scanner(System.in); int n, m; while (in.hasNext()) { n = in.nextInt(); m = in.nextInt(); String[] p = new String[n]; String[] r = new String[n]; String s1, s2; in.nextLine(); for (int i = 0; i < n; i++) { String[] split = in.nextLine().split(" "); p[i] = split[0]; r[i] = split[1]; } for (int i = 0; i < m; i++) { boolean flag = true; //flag == false 表示找到 s1 = in.next(); int j; for (j = 0; j < n; j++) { flag = !check(s1, p[j]); if (!flag) { //找到 break; } } if (flag) { System.out.println(404); } else { System.out.print(r[j]); for (int k = 0; k < ans.size(); k++) { if (check(ans.get(k)) == "<int>") { System.out.print(" " + toi(ans.get(k))); } else { System.out.print(" " + ans.get(k)); } } System.out.println(); } } } } private static int toi(String str) { int ans = 0; int len = str.length(); for (int i = 0; i < len; i++) { ans = ans*10 + str.charAt(i) - '0'; } return ans; } private static boolean check(String strp, String strq) { List<String> cnt1 = new ArrayList<>(); List<String> cnt2 = new ArrayList<>(); solve(cnt1, strq); solve(cnt2, strp); int tot = 1; if (cnt1.size() > cnt2.size()) { return false; } if (cnt1.size() >= 1) { if (cnt1.size() < cnt2.size() && !cnt1.get(cnt1.size()-1).equals("<path>")) { return false; } } if (cnt1.size() == 0 && cnt2.size() != 0) { return false; } ans.clear(); for (int i = 0; i < cnt1.size(); i++) { if (cnt1.get(i).equals(cnt2.get(i))) { tot += (cnt2.get(i).length() + 1); continue; } else if (cnt1.get(i).equals("<path>")) { ans.add(strp.substring(tot, strp.length())); return true; } else if (cnt1.get(i).equals(check(cnt2.get(i)))) { ans.add(cnt2.get(i)); tot += (cnt2.get(i).length()+1); } else { return false; } } if (strp.charAt(strp.length()-1) == '/' && strq.charAt(strq.length()-1) != '/') { return false; } if (strp.charAt(strp.length()-1) != '/' && strq.charAt(strq.length()-1) == '/') { return false; } return true; } private static void solve(List<String> V, String str) { V.clear(); int len = str.length(); String cnt = ""; for (int i = 1; i < len; i++) { if (str.charAt(i) == '/') { V.add(cnt); cnt = ""; } else { cnt += str.charAt(i); } } if (cnt != "") { V.add(cnt); } } private static String check(String str) { int len = str.length(); int flag = 0; for (int i = 0; i < len; i++) { if (str.charAt(i) < '0' || str.charAt(i) > '9') { flag = 1; break; } } if (flag == 0) { return "<int>"; } else { return "<str>"; } } }