Luogu P2382 化學分子式 (類比)

來源:互聯網
上載者:User

標籤:string   code   lin   att   include   can   int   努力   register   

題目題目背景

元首和元老正在共同努力學習化學,他們想讓電腦協助他類比分子式減輕負擔。請你幫他設計一個程式。

題目描述

你的任務是編寫一個能處理在虛擬化學裡分子式的程式,在真正的化學裡,每個分子式描述分子包括一個或者多個原子,但是,它可能沒有真正的化學藥品。

下面是原子符號和分子式的定義:

分子中一個原子由一個原子符號表示,原子符號由單個大寫字母或者一個大寫字母和一個小寫字母組成。例如:H和He都是原子符號。

一個分子式是一個原子符號的非空序列,例如,\(HHHeHHHe\)是一個分子式,表示一個分子包括\(4\)個\(H\)和\(2\)個\(He\)。

為了方便起見,一段相同的式子,如\(x\cdots x\)(\(n\)個\(X\),\(2\leq n\leq 99\)),可以被縮寫為\((X)_n\)。如果\(X\)是一個原子符號,那麼括弧可以省略。例如,\(HHHeHHHe\)也可以寫作\(H_2HeH_2He\),\((HHHe)_2\),\((H_2He)_2\),\(((H)_2He)_2\)。

分子式的定義可以用一種規範的語言描述。簡而言之,分子式的文法描述如下:

分子:原子|原子數量|(分子)數字|分子 分子
原子:大寫字母|大寫字母 小寫字母

數字:\(2|3|4|5|\cdots|99|\)
大寫字母:\(A|B|\cdots|Z|\)
小寫字母:\(a|b|c|\cdots|z|\)

在我們這個虛擬化學裡的每一個原子都有自己的原子品質,給你原子的品質,你的程式必須輸出一個用分子式表示的分子品質。分子的品質定義為所有包括的原子的品質之和。例如,假設\(H\)和\(He\)的原子品質為\(1\)和\(4\),那麼\((H_2He)_2\)的分子量為\(12\)。

輸入輸出格式輸入格式:

輸入由兩部分組成。第一部分是原子表,由一些行組成,每行包括一個原子符號、一個或者多個空格,以及該原子的原子品質(\(\leq 1000\))。沒有兩行包含相同的原子符號。

第一部分最後僅包括一行字串"END_OF_FIRST_PART"

第二部分是一些行的序列。每行是一個分子式,不多於\(80\)個字元,而且不包括空格。一個分子最多包括\(10^5\)個原子,一些分子中的原子可能沒有在原子表中出現。

最後一行僅一個零,表示輸入結束。

輸出格式:

輸出時一些行的序列,和輸入檔案的第二部分行數相同。如果分子中的每一個原子都在原子表中出現,輸出一個整數,並表示分子品質。否者輸出UNKNOWN。不要輸出多餘的字元。

輸入輸出範例輸入範例:
H 1He 4C 12O 16F 19Ne 20Cu 64Cc 333END_OF_FIRST_PARTH2C(MgF)2AsCu(OH)2H((CO)2F)990
輸出範例:
14UNKNOWN987426
題解

第一次寫的時候用的棧來類比, RE+WA, 索性全刪了重新用DFS寫了一遍就過了\(\cdots \cdots\)

純類比, 不多說。

#include <iostream>#include <map>#include <string>#include <cstdio>#include <cctype>std::map<std::string, int> elements;std::string matter;int cur, weight, length;inline int GetInt() {  register int ret(0);  while (cur < length && isdigit(matter[cur])) {    ret = ret * 10 + matter[cur++] - '0';  }  return ret ? ret : 1;}inline int Dfs() {  register int ret(0);  while (cur < length) {    if (matter[cur] == '(') {      ++cur;      ret += Dfs();    } else if (matter[cur] == ')') {      ++cur;      return ret * GetInt();    } else {      if (isalpha(matter[cur + 1]) && islower(matter[cur + 1])) {        register std::string cur_element = std::string("") + matter[cur] + matter[cur + 1];        if (!elements.count(cur_element)) {          return -2147483647;        }        ++++cur;        ret += elements[cur_element] * GetInt();      } else {        register std::string cur_element = std::string("") + matter[cur];        if (!elements.count(cur_element)) {          return -2147483647;        }        ++cur;        ret += elements[cur_element] * GetInt();      }    }  }  return ret;}int main(int argc, char const *argv[]) {  {    register std::string element;    while (std::cin >> element && element != "END_OF_FIRST_PART") {      scanf("%d", &weight);      elements[element] = weight;    }    while (std::cin >> matter && matter != "0") {      cur = 0, length = matter.length();      register int num(Dfs());      if (num < 0) {        puts("UNKNOWN");      } else {        printf("%d\n", num);      }    }  }  return 0;}

Luogu P2382 化學分子式 (類比)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.