先来 T1 大模拟镇楼,其它题补完再写。
1 #include <iostream>
2 #include <string>
3 #include <algorithm>
4 #include <cstdio>
5 const std::string D = "GSBQ";
6 std::string erase(std::string s, int l, int r) {
7 if (l > r) return s;
8 return s.substr(0, l) + s.substr(r+1, s.size()-r-1);
9 }
10 struct twt {
11 std::string org, Z, F, ans;
12 bool isPos, isZer;
13 twt() { isPos = 1; isZer = 0; org = Z = F = ans = ""; }
14 void opt() {
15 int cntn = 0, pos = 0;
16 for (int i = 0; i < (signed)org.size() && org[i] == '+'
17 || org[i] == '-'; i++)
18 cntn += org[i] == '-', pos ++;
19 if (cntn % 2 == 0) isPos = 1;
20 else isPos = 0;
21 org = org.substr(pos, org.size() - pos);
22 }
23 void div() {
24 int pos = -1;
25 for (int i = 0; i < (signed)org.size(); i++)
26 if (org[i] == '.') { pos = i; break; }
27 Z = org.substr(0, pos);
28 if (pos != -1 && pos != (signed)org.size() - 1)
29 F = org.substr(pos+1, org.size()-pos-1);
30 }
31 void prez() {
32 int pos = 0;
33 for (int i = 0; i < (signed)Z.size() && Z[i] == '0'; i++)
34 pos ++;
35 Z = Z.substr(pos, Z.size() - pos);
36 }
37 void sucz() {
38 int pos = (signed)F.size() - 1;
39 for (int i = (signed)F.size() - 1; i >= 0 && F[i] == '0'; i--)
40 pos --;
41 F = F.substr(0, pos + 1);
42 }
43 std::string printUnit(std::string t) {
44 std::string an;
45 if (t == "0000") return "";
46 if (t[0] != '0') an += t[0];
47 bool proz = 0;
48 for (int i = 1; i < (signed)t.size(); i++)
49 if (t[i] != '0') {
50 if (!proz) an = an + D[i] + t[i];
51 else proz = 0, an = an + "0" + D[i] + t[i];
52 }
53 else proz = 1;
54 if (proz) an = an + "0";
55 return an;
56 }
57 std::string fix(std::string x) {
58 bool doit = 1;
59 while (doit) {
60 int pos = -1;
61 for (int i = 0; i < (signed)x.size()-1; i++)
62 if (x[i] == '0' && (x[i+1] == 'Q' ||
63 x[i+1] == 'B' ||
64 x[i+1] == 'S')) pos = i;
65 if (pos == -1) doit = 0;
66 else x = erase(x, pos, pos+1);
67 }
68
69 int pos = (signed)x.size() - 1;
70 for (int i = (signed)x.size() - 1; i >= 0 && x[i] == '0'; i--)
71 pos --;
72 x = erase(x, pos+1, x.size()-1);
73
74 for (int i = 0; i < (signed)x.size()-1; i++)
75 if (x[i] == '0' && x[i+1] == 'W') {
76 x = erase(x, i, i);
77 break;
78 }
79
80 for (int i = 0; i < (signed)x.size()-1; i++)
81 if (x[i] == '0' && x[i+1] == 'Y') {
82 x = erase(x, i, i);
83 break;
84 }
85 return x;
86 }
87 void print() {
88 std::reverse(Z.begin(), Z.end());
89 std::string an;
90 if (Z.size() == 0) an += "0";
91 else if (Z.size() > 4) {
92 an += printUnit(Z.substr(0, 4)) + "W";
93 if (Z.size() > 8) {
94 if (Z.substr(4, 4) != "0000") an += printUnit(Z.substr(4, 4));
95 else an = erase(an, an.size()-1, an.size()-1);
96 an += "Y" + printUnit(Z.substr(8, Z.size() - 8));
97 }
98 else an += printUnit(Z.substr(4, Z.size()-4));
99 }
100 else an += printUnit(Z.substr(0, Z.size()));
101
102 std::reverse(an.begin(), an.end());
103 // std::cout << an;
104 an = fix(an);
105
106 if (F.size()) an = an + ((!an.size()) ? "0" : "") + "D" + F;
107 if (!Z.size() && !F.size()) isZer = 1;
108 ans = an;
109 }
110 void doit(std::string x) {
111 org = x;
112 opt(), div(), prez(), sucz(), print();
113 }
114 };
115 struct dwd {
116 twt m, s;
117 std::string t;
118 bool isM;
119 dwd () { isM = 0; }
120 void read() {
121 std::cin >> t;
122 int pos = -1;
123 for (int i = 0; i < (signed)t.size(); i++)
124 if (t[i] == '/') { pos = i; break; }
125 if (pos == -1) s.doit(t);
126 else s.doit(t.substr(0, pos)), isM = 1, m.doit(t.substr(pos+1, t.size()-pos-1));
127 }
128 void print() {
129 bool isNeg = m.isPos ^ s.isPos;
130 if (s.ans == "" || s.ans == "0") return std::cout << "0", void();
131 if (m.ans == "1") isM = 0;
132 if (isNeg) std::cout << "F";
133 if (isM) std::cout << m.ans << "fz";
134 std::cout << s.ans;
135 }
136 } a;
137 int main() {
138 freopen("read.in", "r", stdin);
139 freopen("read.out", "w", stdout);
140
141 std::ios::sync_with_stdio(false);
142 a.read(), a.print();
143 return 0;
144 }
145
146 // 0156Z - Coding completed
147 // 0156Z - Before submit checklist completed