■ 1217 Family Tree
入力の解析が少し面倒.クエリに対する判定は,ある人の親さえ分かれば非常に簡単に出来る.下記のコードではchildrenも記録していたけど全く必要なかった.
import java.util.*; import java.lang.*; import java.math.*; import java.io.*; import static java.lang.Math.*; import static java.util.Arrays.*; public class Main{ Scanner sc=new Scanner(System.in); int INF=1<<28; double EPS=1e-9; int n, m; HashMap<String, String> parent; HashMap<String, LinkedList<String>> children; void run(){ for(;;){ n=sc.nextInt(); m=sc.nextInt(); if((n|m)==0){ break; } parent=new HashMap<String, String>(); children=new HashMap<String, LinkedList<String>>(); sc.nextLine(); String p="", r=""; // 親, 1つ前 children.put(p, new LinkedList<String>()); int x=-1; for(int j=0; j<n; j++){ String s=sc.nextLine(); int y=s.length()-s.replaceAll(" ", "").length(); s=s.replaceAll(" ", ""); // debug(s, r, p); if(y>x){ p=r; }else if(y<x){ for(int i=y; i<x; i++){ p=parent.get(p); } } parent.put(s, p); children.get(p).add(s); children.put(s, new LinkedList<String>()); x=y; r=s; } // dfs("", ""); for(int i=0; i<m; i++){ String s=sc.next(); sc.next(); sc.next(); char c=sc.next().charAt(0); sc.next(); String t=sc.next(); t=t.substring(0, t.length()-1); boolean f=false; switch(c){ case 'c': f=parent.containsKey(s)&&parent.get(s).equals(t); break; case 'p': f=parent.containsKey(t)&&parent.get(t).equals(s); break; case 's': f=parent.containsKey(s)&&parent.containsKey(t) &&parent.get(s).equals(parent.get(t)); break; case 'd': for(s=parent.get(s); s!=null; s=parent.get(s)){ f|=s.equals(t); } break; case 'a': for(t=parent.get(t); t!=null; t=parent.get(t)){ f|=t.equals(s); } break; } println(f?"True":"False"); } println(""); } } void dfs(String s, String tab){ for(String t : children.get(s)){ debug(tab, t, parent.get(t)); dfs(t, tab+"\t"); } } void debug(Object... os){ // System.err.println(Arrays.deepToString(os)); } void print(String s){ System.out.print(s); } void println(String s){ System.out.println(s); } public static void main(String[] args){ // System.setOut(new PrintStream(new BufferedOutputStream(System.out))); new Main().run(); } }
0 件のコメント:
コメントを投稿