■ 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 件のコメント:
コメントを投稿