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