⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chem_felicia.cpp

📁 第四届百度杯预赛解题报告 武汉大学20090315
💻 CPP
字号:
/**********************************************************************
Author: Felicia
Created Time:  2009-2-9 10:07:49
File Name: whu09_1.cpp
Description: 
**********************************************************************/
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <string>
#include <map>

using namespace std;

typedef long long int64;
const int maxint = 0x7FFFFFFF;
const int64 maxint64 = 0x7FFFFFFFFFFFFFFFLL;

const int maxelement = 200;

map <string, int> id;
int w[maxelement];
string ele[maxelement];

int element_cnt;

struct bigint {
    static const int maxd = 100;
    static const int base = 100000000;
    int d[maxd];
    int len;
    void clear() {
        len = 0;
        memset(d, 0, sizeof(d));
    }
    bigint() {clear();}
    bigint(int x) {
        clear();
        for (len = 0; x; x /= base)
            d[len++] = x % base;
    }
    void operator +=(const bigint &b) {
        len = max(len, b.len);
        int carry = 0;
        for (int i = 0; i < len; i++) {
            d[i] += b.d[i] + carry;
            if (carry = (d[i] >= base))
                d[i] -= base;
        }
        if (carry) d[len++] = carry;
    }
    void operator *=(const int &x) {
        int carry = 0;
        for (int i = 0; i < len; i++) {
            d[i] = d[i] * x + carry;
            carry = d[i] / base;
            d[i] %= base;
        }
        if (carry) d[len++] = carry;
    }
    void print(int t) {
        char s[1000];
        if (len == 0) {
            if (t == 0)
                printf("0");
            else
                printf("0.00");
            return;
        }
        if (len == 1) {
            if (t == 0)
                printf("%d", d[0]);
            else
                printf("%.2lf", d[0] / 100.0);
            return;
        }
        sprintf(s, "%d", d[len - 1]);
        int p = strlen(s);
        for (int i = len - 2; i >= 0; i--) {
            sprintf(s + p, "%08d", d[i]);
            p += 8;
        }
        for (int i = 0; i < p; i++) {
            if (i == p - t)
                printf(".");
            printf("%c", s[i]);
        }
    }
};

struct node {
    bigint mass;
    bigint num[200];
    node() {}
    void operator *=(const int &t) {
        mass *= t;
        for (int i = 0; i < element_cnt; i++)
            num[i] *= t;
    }
    void operator +=(const node &b) {
        mass += b.mass;
        for (int i = 0; i < element_cnt; i++)
            num[i] += b.num[i];        
    }
    void clear() {
        mass.clear();
        for (int i = 0; i < element_cnt; i++)
            num[i].clear();
    }
};

int get_id(const string &num, int l, int r) {
    string t;
    for (int i = l; i < r; i++)
        t.push_back(num[i]);
    return id[t];
}

node stack[300];

void chem_parser(string s) {
    int top = 0;
    stack[top].clear();
    for (unsigned i = 0; i < s.size(); i++) {
        if (s[i] == '(')
            stack[++top].clear();
        else if (s[i] == ')') {
            int t = s[++i] - '0';
            stack[top] *= t;
            stack[top - 1] += stack[top];
            --top;
        }
        else if (isupper(s[i])) {
            int id;
            if (i + 1 < s.size() && islower(s[i + 1])) {
                id = get_id(s, i, i + 2);
                ++i;
            }
            else {
                id = get_id(s, i, i + 1);
            }
            int t = 1;
            if (i + 1 < s.size() && isdigit(s[i + 1])) {
                t = s[i + 1] - '0';
                ++i;
            }
            stack[top].mass += w[id] * t;
            stack[top].num[id] += t;
        }
    }
}

int main() {
    int ca = 0;
    scanf("%d", &ca);
    while (ca--) {
        scanf("%d", &element_cnt);
        id.clear();
        for (int i = 0; i < element_cnt; i++) {
            char buf[100];
            int t1, t2;
            scanf("%s%d.%d", buf, &t1, &t2);
            ele[i] = buf;
            id[buf] = i;
            w[i] = t1 * 100 + t2;
        }
        int m;
        scanf("%d", &m);
        for (int i = 0; i < m; i++) {
            char buf[1100];
            scanf("%s", buf);
            chem_parser(buf);
            stack[0].mass.print(2);
            for (int j = 0; j < element_cnt; j++)
                if (stack[0].num[j].len != 0) {
                    printf(" %s[", ele[j].c_str());
                    stack[0].num[j].print(0);
                    printf("]");
                }
            printf("\n");
        }
    }
    return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -