2011年6月7日火曜日

Aizu Online Judge 1244 Molecular Formula

■1244 Molecular Formula

構文解析ゲー.
  1. import java.util.*;  
  2. import java.lang.*;  
  3. import java.math.*;  
  4. import java.io.*;  
  5.   
  6. import static java.lang.Math.*;  
  7. import static java.util.Arrays.*;  
  8.   
  9. // AC  
  10. public class Main{  
  11.   
  12.  Scanner sc=new Scanner(System.in);  
  13.   
  14.  HashMap<String, Integer> map;  
  15.  String s;  
  16.  boolean unknown;  
  17.   
  18.  void run(){  
  19.   map=new HashMap<String, Integer>();  
  20.   for(;;){  
  21.    String s=sc.next();  
  22.    if(s.equals("END_OF_FIRST_PART")){  
  23.     break;  
  24.    }  
  25.    int n=sc.nextInt();  
  26.    map.put(s, n);  
  27.   }  
  28.   for(;;){  
  29.    s=sc.next();  
  30.    if(s.equals("0")){  
  31.     break;  
  32.    }  
  33.    s+='\0';  
  34.    unknown=false;  
  35.    Result r=molecule(0);  
  36.    println(unknown?"UNKNOWN":r.value+"");  
  37.    debug(r.p, r.value);  
  38.   }  
  39.  }  
  40.   
  41.  Result molecule(int p){  
  42.   debug("molecule", p);  
  43.   Result r=new Result(p, 0);  
  44.   for(;;){  
  45.    if(s.charAt(r.p)=='\0'||s.charAt(r.p)==')'){  
  46.     // end of molecule  
  47.     return r;  
  48.    }else if(s.charAt(r.p)=='('){  
  49.     Result r1=molecule(r.p+1);  
  50.     Result r2=number(r1.p+1); // skip '('  
  51.     r.value+=r1.value*r2.value;  
  52.     r.p=r2.p;  
  53.    }else{  
  54.     Result r1=atom(r.p);  
  55.     Result r2=number(r1.p);  
  56.     r.value+=r1.value*r2.value;  
  57.     r.p=r2.p;  
  58.    }  
  59.   }  
  60.  }  
  61.   
  62.  Result atom(int p){  
  63.   debug("atom", p);  
  64.   String atom="";  
  65.   if(Character.isUpperCase(s.charAt(p))){  
  66.    atom+=s.charAt(p);  
  67.    p++;  
  68.    if(Character.isLowerCase(s.charAt(p))){  
  69.     atom+=s.charAt(p);  
  70.     p++;  
  71.    }  
  72.   }  
  73.   debug(atom);  
  74.   if(map.containsKey(atom)){  
  75.    return new Result(p, map.get(atom));  
  76.   }else{  
  77.    unknown=true;  
  78.    return new Result(p, 0);  
  79.   }  
  80.  }  
  81.   
  82.  Result number(int p){  
  83.   debug("number", p);  
  84.   int value=0;  
  85.   if(Character.isDigit(s.charAt(p))){  
  86.    value=s.charAt(p)-'0';  
  87.    p++;  
  88.    if(Character.isDigit(s.charAt(p))){  
  89.     value=value*10+s.charAt(p)-'0';  
  90.     p++;  
  91.    }  
  92.   }else{  
  93.    return new Result(p, 1);  
  94.   }  
  95.   return new Result(p, value);  
  96.  }  
  97.   
  98.  class Result{  
  99.   int p, value;  
  100.   
  101.   Result(int p, int value){  
  102.    this.p=p;  
  103.    this.value=value;  
  104.   }  
  105.  }  
  106.   
  107.  void debug(Object... os){  
  108.   // System.err.println(Arrays.deepToString(os));  
  109.  }  
  110.   
  111.  void print(String s){  
  112.   System.out.print(s);  
  113.  }  
  114.   
  115.  void println(String s){  
  116.   System.out.println(s);  
  117.  }  
  118.   
  119.  public static void main(String[] args){  
  120.   // System.setOut(new PrintStream(new BufferedOutputStream(System.out)));  
  121.   new Main().run();  
  122.  }  
  123. }  

0 件のコメント: