forked from ngthanhtrung23/CompetitiveProgramming
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathE.cpp
More file actions
98 lines (82 loc) · 2.85 KB
/
E.cpp
File metadata and controls
98 lines (82 loc) · 2.85 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include <bits/stdc++.h>
#define FOR(i,a,b) for(int i=(a),_b=(b); i<=_b; ++i)
#define FORD(i,a,b) for(int i=(a),_b=(b); i>=_b; --i)
#define REP(i,a) for(int i=0,_a=(a); i < _a; ++i)
#define DEBUG(X) { cout << #X << " = " << X << endl; }
#define PR(A,n) { cout << #A << " = "; FOR(_,1,n) cout << A[_] << ' '; cout << endl; }
#define PR0(A,n) { cout << #A << " = "; REP(_,n) cout << A[_] << ' '; cout << endl; }
#define sqr(x) ((x) * (x))
#define ll long long
#define SZ(x) ((int) (x).size())
using namespace std;
const int MN = 111;
string name[MN], expr[MN];
int n;
map<string,int> cache;
int parse(const string& s, int l, int r) {
// DEBUG(s.substr(l, r - l + 1));
int sum = 0;
FORD(i,r,l) {
if (s[i] == ')') ++sum;
else if (s[i] == '(') --sum;
else if (s[i] == '+' || s[i] == '-') {
if (sum == 0) {
int left = parse(s, l, i - 1);
int right = parse(s, i+1, r);
if (!left) return 0; // left side is invalid
if (!right) return 0; // right side is invalid
if (s[i] == '-' && right == 1) return 0; // right side is add/sub --> invalid
return 1; // sum
}
}
}
assert(sum == 0);
FORD(i,r,l) {
if (s[i] == ')') ++sum;
else if (s[i] == '(') --sum;
else if (s[i] == '*' || s[i] == '/') {
if (sum == 0) {
int left = parse(s, l, i-1);
int right = parse(s, i+1, r);
if (left <= 1) return 0; // left side is invalid / add
if (right <= 1) return 0; // right side is invalid / add
if (s[i] == '/' && right <= 2) return 0;
return 2; // mult
}
}
}
assert(sum == 0);
if (s[l] == '(') {
int t = parse(s, l+1, r-1);
if (t == 0) return 0;
return 3; // atomic
}
string tmp = s.substr(l, r - l + 1);
if (cache.count(tmp)) return cache[tmp];
else return 3; // atomic
}
string refine(string s) {
string res = "";
for(char c : s) if (c != ' ') res += c;
return res;
}
int main() {
ios :: sync_with_stdio(0); cin.tie(0);
while (cin >> n) {
FOR(i,1,n) {
char hash = ' '; while (hash != '#') cin >> hash;
string def;
cin >> def >> name[i];
getline(cin, expr[i]);
expr[i] = refine(expr[i]);
cache[name[i]] = parse(expr[i], 0, SZ(expr[i]) - 1);
}
// cout << "--------------" << endl;
// FOR(i,1,n) cout << name[i] << " ---> " << expr[i] << endl;
string s;
getline(cin, s);
s = refine(s);
if (parse(s, 0, SZ(s) - 1)) cout << "OK"; else cout << "Suspicious";
cout << endl;
}
}