Submission #00021


ソースコード

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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#include <bits/stdc++.h>
using namespace std;
struct query {
string type;
int var1, var2, var3;
};
int n;
map<pair<int, map<char, int> >, bool> visited;
map<char, int> val;
map<int, query> program;
int lines[1001];
bool is_alpha(char c) {
return ('a' <= c && c <= 'z');
}
int strtoint(string s) {
stringstream ss(s);
int a;
ss >> a;
return a;
}
int main() {
cin >> n;
int first_l, last_l;
for(int i = 0; i < n; ++i) {
int l;
string t;
cin >> l >> t;
if(t == "ADD" || t == "SUB") {
string var1, var2, var3;
cin >> var1 >> var2 >> var3;
val[var1[0]] = val[var2[0]] = 0;
if(is_alpha(var3[0])) {
val[var3[0]] = 0;
program[l] = (query){ t, var1[0], var2[0], var3[0] };
} else {
program[l] = (query){ t, var1[0], var2[0], strtoint(var3) };
}
} else if(t == "SET" || t == "IF") {
string var1, var2;
cin >> var1 >> var2;
val[var1[0]] = 0;
if(is_alpha(var2[0])) {
val[var2[0]] = 0;
program[l] = (query){ t, var1[0], var2[0], '0' };
} else {
program[l] = (query){ t, var1[0], strtoint(var2), '0' };
}
} else if(t == "HALT") {
program[l] = (query){ t, '0', '0', '0' };
}
if(i) {
lines[last_l] = l;
} else {
first_l = l;
}
last_l = l;
}
lines[last_l] = -1;
bool is_loop = false;
int l = first_l;
while(true) {
if(program.count(l) == 0) {
break;
}
if(l == -1) {
break;
}
query q = program[l];
string t = q.type;
int var1 = q.var1;
int var2 = q.var2;
int var3 = q.var3;
visited[make_pair(l, val)] = true;
if(t == "ADD") {
int tmp;
if(is_alpha(var3)) {
tmp = val[var2] + val[var3];
} else {
tmp = val[var2] + var3;
}
if(tmp < 0 || tmp >= 16) {
break;
} else {
val[var1] = tmp;
}
l = lines[l];
} else if(t == "SUB") {
int tmp;
if(is_alpha(var3)) {
tmp = val[var2] - val[var3];
} else {
tmp = val[var2] - var3;
}
if(tmp < 0 || tmp >= 16) {
break;
} else {
val[var1] = tmp;
}
l = lines[l];
} else if(t == "SET") {
if(is_alpha(var2)) {
val[var1] = val[var2];
} else {
val[var1] = var2;
}
l = lines[l];
} else if(t == "IF") {
if(val[var1]) {
l = var2;
} else {
l = lines[l];
}
} else if(t == "HALT") {
break;
}
if(visited.count(make_pair(l, val)) != 0) {
is_loop = true;
break;
}
}
if(is_loop) {
cout << "inf" << endl;
} else {
map<char, int>::iterator it = val.begin();
while(it != val.end()) {
cout << it->first << "=" << it->second << endl;
++it;
}
}
}

ステータス

項目 データ
問題 0006 - プログラム停止判定
ユーザー名 七代目清水天三郎丸
投稿日時 2017-10-24 17:59:21
言語 C++11
状態 Memory Limit Exceeded
得点 0
ソースコード長 3571 Byte
最大実行時間 5000 ms
最大メモリ使用量 262144 KB

セット

セット 得点 Cases
1 ALL 0 / 10 *

テストケース

ファイル名 状態 実行時間 メモリ使用量 #
in01.txt AC 17 ms 476 KB
1
in02.txt AC 17 ms 436 KB
1
in03.txt AC 15 ms 540 KB
1
in04.txt AC 13 ms 512 KB
1
in05.txt AC 19 ms 456 KB
1
in06.txt AC 18 ms 544 KB
1
in07.txt AC 16 ms 516 KB
1
in08.txt AC 21 ms 484 KB
1
in09.txt AC 21 ms 584 KB
1
in10.txt AC 19 ms 680 KB
1
in11.txt MLE 5000 ms 262144 KB
1
in12.txt AC 23 ms 6068 KB
1