1 #include <cstdio>
2 #include <cstring>
3 char str[60];
4 int judge(char c)
5 {
6 if(c >= ‘0‘ && c <= ‘9‘)
7 return 1;
8 else
9 return 0;
10 }
11 int main()
12 {
13 int t, i, j;
14 int num;//几个分子
15 char a[60];
16 int sum;//总分子量
17 int v;//当前原子分子量
18 int temp;//括号外面数字
19 scanf("%d", &t);
20 while(t--)
21 {
22 scanf("%s", a);
23 for(i = 0; i < strlen(a); i++)
24 if(a[i] == ‘=‘)
25 break;
26 i = i + 1;
27 for(j = 0; i < strlen(a) && a[i] != ‘+‘; j++, i++)
28 {
29 str[j] = a[i];
30 }
31 str[j] = ‘\0‘;
32 num = 1;
33 int start = 0;
34 if(judge(str[0]))
35 {
36 start++;
37 num = str[0] - ‘0‘;
38 }
39 sum = 0;
40 for(i = start; i < strlen(str); i++)
41 {
42 if(str[i] == ‘(‘)
43 {
44 int s = 0;//计算括号里面的分子量
45 for(; i < strlen(str) && str[i] != ‘)‘; i++)
46 {
47 if(str[i] == ‘S‘ || str[i] == ‘O‘ || str[i] == ‘H‘)
48 {
49 if(str[i] == ‘S‘)
50 v = 32;
51 else if(str[i] == ‘O‘)
52 v = 16;
53 else
54 v = 2;
55 if(judge(str[i+1]))//后一项是数字
56 {
57 s += v * (str[i+1] - ‘0‘);
58 i += 1;
59 }
60 else
61 s += v;
62 }
63 else if(str[i] == ‘Z‘ || str[i] == ‘A‘)
64 {
65 if(str[i] == ‘Z‘)
66 v = 65;
67 else
68 v = 27;
69 if(judge(str[i+2]))
70 {
71 s += v * (str[i+2] - ‘0‘);
72 i += 2;
73 }
74 else
75 s += v;
76 }
77 else if(str[i] == ‘N‘)
78 {
79 if(judge(str[i+1]))
80 {
81 s += 14 * (str[i+1] - ‘0‘);
82 i += 1;
83 }
84 else if(str[i+1] == ‘a‘)
85 {
86 if(judge(str[i+2]))
87 {
88 s += 23 * (str[i+2] - ‘0‘);
89 i += 2;
90 }
91 else
92 {
93 s += 23;
94 i += 1;
95 }
96 }
97 else
98 s += 14;
99 }
100 else if(str[i] == ‘C‘)
101 {
102 if(judge(str[i+1]))
103 {
104 s += 12 * (str[i+1] - ‘0‘);
105 i += 1;
106 }
107 else if(str[i+1] == ‘l‘ || str[i+1] == ‘a‘)
108 {
109 if(str[i+1] == ‘l‘)
110 v = 35;
111 else
112 v = 40;
113 if(judge(str[i+2]))
114 {
115 s += v * (str[i+2] - ‘0‘);
116 i += 2;
117 }
118 else
119 {
120 s += v;
121 i += 1;
122 }
123 }
124 else
125 s += 12;
126 }
127 }
128 temp = 1;//括号后面是否有数字
129 if(judge(str[i+1])) temp = str[i+1] - ‘0‘;
130 sum += s * temp;
131 }
132 else
133 {
134 if(str[i] == ‘S‘ || str[i] == ‘O‘ || str[i] == ‘H‘)
135 {
136 if(str[i] == ‘S‘)
137 v = 32;
138 else if(str[i] == ‘O‘)
139 v = 16;
140 else
141 v = 2;
142 if(judge(str[i+1]))//后一项是数字
143 {
144 sum += v * (str[i+1] - ‘0‘);
145 i += 1;
146 }
147 else
148 sum += v;
149 }
150 else if(str[i] == ‘Z‘ || str[i] == ‘A‘)
151 {
152 if(str[i] == ‘Z‘)
153 v = 65;
154 else
155 v = 27;
156 if(judge(str[i+2]))
157 {
158 sum += v * (str[i+2] - ‘0‘);
159 i += 2;
160 }
161 else
162 sum += v;
163 }
164 else if(str[i] == ‘N‘)
165 {
166 if(judge(str[i+1]))
167 {
168 sum += 14 * (str[i+1] - ‘0‘);
169 i += 1;
170 }
171 else if(str[i+1] == ‘a‘)
172 {
173 if(judge(str[i+2]))
174 {
175 sum += 23 * (str[i+2] - ‘0‘);
176 i += 2;
177 }
178 else
179 {
180 sum += 23;
181 i += 1;
182 }
183 }
184 else
185 sum += 14;
186 }
187 else if(str[i] == ‘C‘)
188 {
189 if(judge(str[i+1]))
190 {
191 sum += 12 * (str[i+1] - ‘0‘);
192 i += 1;
193 }
194 else if(str[i+1] == ‘l‘ || str[i+1] == ‘a‘)
195 {
196 if(str[i+1] == ‘l‘)
197 v = 35;
198 else
199 v = 40;
200 if(judge(str[i+2]))
201 {
202 sum += v * (str[i+2] - ‘0‘);
203 i += 2;
204 }
205 else
206 {
207 sum += v;
208 i += 1;
209 }
210 }
211 else
212 sum += 12;
213 }
214 }
215 }
216 printf("%04d\n", sum * num);
217 }
218 return 0;
219 }