题意就是根据咒语查功能,根据功能查看是否存在相应咒语,题意简单,不过是道不错的练习题。
下面的都MLE了,听说C++用G++提交才可以AC,否则也MLE;方法很多,不想做了……
方法一:我用Java的HashMap一直MLE,即便由value反查key减少映射数也一样MLE,听说C++的map可以AC。
方法二:快排+二分
方法三:Hash方法,用31求幂。
import java.util.*; //写俩Mappublic class HDU1880 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String str =null; Mapmap1 = new HashMap (); Map map2 = new HashMap (); String[] s0; while(true) { str = sc.nextLine(); if(str.equals("@END@")) { break; } s0 = str.split(" ", 2); str = s0[0].substring(1,s0[0].length()-1); map1.put(str,s0[1]); map2.put(s0[1], str); } int n = sc.nextInt(); for(int i=0; i ) { String s = sc.next(); s += sc.nextLine(); if(s.charAt(0)=='[') { s = s.substring(1, s.length()-1); boolean tag = map1.containsKey(s); if(tag) { System.out.println(map1.get(s)); }else { System.out.println("what?"); } }else { boolean tag = map2.containsKey(s); if(tag) { System.out.println(map2.get(s)); }else { System.out.println("what?"); } } } } } import java.util.*; //一个Map存两次 public class HDU1880 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String str =null; Mapmap = new HashMap (); String[] s0; while(true) { str = sc.nextLine(); if(str.equals("@END@")) { break; } s0 = str.split(" ", 2); str = s0[0].substring(1,s0[0].length()-1); map.put(str,s0[1]); map.put(s0[1], str); } int n = sc.nextInt(); for(int i=0; i ) { String s = sc.next(); s += sc.nextLine(); if(s.charAt(0)=='[') { s = s.substring(1, s.length()-1); } boolean tag = map.containsKey(s); if(tag) { System.out.println(map.get(s)); }else { System.out.println("what?"); } } } } import java.util.*; //map里反查key public class HDU1880 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String str =null; Mapmap = new HashMap (); String[] s0; while(true) { str = sc.nextLine(); if(str.equals("@END@")) { break; } s0 = str.split(" ", 2); str = s0[0].substring(1,s0[0].length()-1); map.put(str,s0[1]); } int n = sc.nextInt(); for(int i=0; i ) { String s = sc.next(); s += sc.nextLine(); if(s.charAt(0)=='[') { s = s.substring(1, s.length()-1); boolean tag = map.containsKey(s); if(tag) { System.out.println(map.get(s)); }else { System.out.println("what?"); } }else { ArrayList arr = valueGetKey(map,s); if(arr.isEmpty()) { System.out.println("what?"); }else { System.out.println(arr.get(0)); } } } } private static ArrayList valueGetKey(Map map,String value) { Set set = map.entrySet(); ArrayList arr = new ArrayList (); Iterator > it = set.iterator(); while(it.hasNext()) { Map.Entry entry = (Map.Entry )it.next(); if(entry.getValue().equals(value)) { String s = entry.getKey(); arr.add(s); } } return arr; } }