[NKU]sweet @ Google && TopCoder && CodeForces

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            33 Posts :: 1 Stories :: 15 Comments :: 0 Trackbacks
          很少寫這種題目……這種題目體力消耗是大于技術含量的……
          題意是這樣,給你兩個化學反應式,讓你判斷是否元素守恒 =_=

          傳送門

          比較關鍵的語法部分:
          • <formula> ::= [<number>] <sequence> { '+' [<number>] <sequence> }
          • <sequence> ::= <element> [<number>] { <element> [<number>] }
          • <element> ::= <chem> | '(' <sequence> ')'
          • <chem> ::= <uppercase_letter> [ <lowercase_letter> ]
          • <uppercase_letter> ::= 'A'..'Z'
          • <lowercase_letter> ::= 'a'..'z'
          • <number> ::= '1'..'9' { '0'..'9' }
          首先要解決一個根本問題,如何說兩個式子就相等了……比較科學的想法還是找一個“標準”表示法,讓他無論式子啥樣,翻譯出來,都應該是那個格式,然后再比較是否相等;于是乎,我們使用TreeMap來干這件事……

          接下來就好辦了……挨層遞歸,把這個Formula變成若干sequence,然后把sequence變成 element;element變回sequence或者返回一個包含關鍵字[<chem>,1]的Treemap……然后遞歸回去,把TreeMap里面的東西乘NUMBER(如果有的話)逐層合并成一個TreeMap……
          感覺上應該可以利用Scanner和正則表達式整的更簡單,但是我不知道括號里套括號的情況正則表達式會搞成什么樣(譬如:(Si(O)2),如果用類似(*)這樣的,匹配出來是(Si(O)還是(Si(O)2),如果我就想要后者應該怎么搞……求神人路過指點吧……)

           1 class Prob {
           2    
           3     TreeMap<String,Integer> merge(TreeMap<String,Integer> a,
           4         TreeMap<String,Integer> b , int cnt) {
           5         for (Map.Entry<String,Integer> i : b.entrySet()) {
           6             String pos = i.getKey();
           7             int delta = a.get(pos) == null ? 0 : a.get(pos);
           8             a.put(pos,delta + i.getValue()*cnt);
           9         }
          10         return a;
          11     }
          12 
          13     TreeMap<String,Integer> workElements(String now) {
          14         if (now.charAt(0== '(') {
          15             return workSequence(now.substring(1,now.length()-1));
          16         }
          17         TreeMap<String,Integer> ans = new TreeMap<String,Integer>();
          18         ans.put(now,1);
          19         return ans;
          20     }
          21 
          22     TreeMap<String,Integer> workSequence(String now) {
          23         TreeMap<String,Integer> ans = new TreeMap<String,Integer>();
          24         while (now.length() > 0) {
          25             int r = 1;
          26             if (now.charAt(0== '(') {
          27                 int cnt = 1;
          28                 while (cnt > 0){
          29                     if (now.charAt(r) == '(') cnt ++;
          30                     if (now.charAt(r) == ')') cnt --;
          31                     r++;
          32                 }
          33             } else {
          34                 while (r < now.length() 
          35                     && now.charAt(r) >= 'a' && now.charAt(r) <='z') {
          36                     r++;
          37                 }
          38             }
          39             String tmp = now.substring(0,r);
          40             now = now.substring(r);
          41             int cnt = 0;
          42             while (now.length() > 0 && now.charAt(0<= '9' && now.charAt(0>='0') {
          43                 cnt = cnt * 10 + now.charAt(0- '0';
          44                 now = now.substring(1);
          45             }
          46             if (cnt == 0) cnt = 1;
          47             ans = merge(ans,workElements(tmp),cnt);
          48         }
          49         return ans;
          50     }
          51 
          52     TreeMap<String,Integer> workFormula (String now) {
          53         TreeMap<String,Integer> ans = new TreeMap<String,Integer>();
          54         StringTokenizer buf = new StringTokenizer(now,"+");
          55         while (buf.hasMoreTokens()){
          56             String tmp = buf.nextToken();
          57             int cnt = 0;
          58             while (tmp.charAt(0<= '9' && tmp.charAt(0>='0') {
          59                 cnt = cnt * 10 + tmp.charAt(0- '0';
          60                 tmp = tmp.substring(1);
          61             }
          62             if (cnt == 0) cnt = 1;
          63             ans = merge(ans,workSequence(tmp),cnt);
          64         }
          65         return ans;
          66     }
          67 
          68     void solve() throws IOException {
          69         MyReader in = new MyReader();
          70         String samp = in.next();
          71         TreeMap<String,Integer> sampTree = workFormula(samp);
          72         for (int ii = in.nextInt(); ii > 0; ii--) {
          73             String now = in.next();
          74             TreeMap<String,Integer> nowTree = workFormula(now);
          75             System.out.print(samp);
          76             if (nowTree.equals(sampTree)) {
          77                 System.out.print("==");
          78             } else {
          79                 System.out.print("!=");
          80             }
          81             System.out.println(now);
          82         }
          83         //.
          84     }
          85     void debug(Objectx) {
          86         System.out.println(Arrays.deepToString(x));
          87     }
          88 }

          posted on 2011-02-24 22:54 sweetsc 閱讀(124) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 读书| 桐梓县| 四平市| 九龙县| 新竹市| 双柏县| 鄂托克前旗| 赣榆县| 望谟县| 阜平县| 益阳市| 商洛市| 石楼县| 乌鲁木齐县| 留坝县| 定西市| 广安市| 乐业县| 九江市| 濮阳县| 平度市| 柳河县| 明溪县| 城市| 乐亭县| 阿克苏市| 柯坪县| 汉中市| 沂南县| 闻喜县| 桃园市| 永定县| 和静县| 托克托县| 阜康市| 沈阳市| 紫金县| 红河县| 千阳县| 和田市| 久治县|