■1244 Molecular Formula
構文解析ゲー.import java.util.*; import java.lang.*; import java.math.*; import java.io.*; import static java.lang.Math.*; import static java.util.Arrays.*; // AC public class Main{ Scanner sc=new Scanner(System.in); HashMap<String, Integer> map; String s; boolean unknown; void run(){ map=new HashMap<String, Integer>(); for(;;){ String s=sc.next(); if(s.equals("END_OF_FIRST_PART")){ break; } int n=sc.nextInt(); map.put(s, n); } for(;;){ s=sc.next(); if(s.equals("0")){ break; } s+='\0'; unknown=false; Result r=molecule(0); println(unknown?"UNKNOWN":r.value+""); debug(r.p, r.value); } } Result molecule(int p){ debug("molecule", p); Result r=new Result(p, 0); for(;;){ if(s.charAt(r.p)=='\0'||s.charAt(r.p)==')'){ // end of molecule return r; }else if(s.charAt(r.p)=='('){ Result r1=molecule(r.p+1); Result r2=number(r1.p+1); // skip '(' r.value+=r1.value*r2.value; r.p=r2.p; }else{ Result r1=atom(r.p); Result r2=number(r1.p); r.value+=r1.value*r2.value; r.p=r2.p; } } } Result atom(int p){ debug("atom", p); String atom=""; if(Character.isUpperCase(s.charAt(p))){ atom+=s.charAt(p); p++; if(Character.isLowerCase(s.charAt(p))){ atom+=s.charAt(p); p++; } } debug(atom); if(map.containsKey(atom)){ return new Result(p, map.get(atom)); }else{ unknown=true; return new Result(p, 0); } } Result number(int p){ debug("number", p); int value=0; if(Character.isDigit(s.charAt(p))){ value=s.charAt(p)-'0'; p++; if(Character.isDigit(s.charAt(p))){ value=value*10+s.charAt(p)-'0'; p++; } }else{ return new Result(p, 1); } return new Result(p, value); } class Result{ int p, value; Result(int p, int value){ this.p=p; this.value=value; } } 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 件のコメント:
コメントを投稿