#include<vector>
#include<map>
#include<string>
#include<cstring>
#include<cstdio>
#include<cstdlib>
using namespace std;
struct rec {
int flag;
int x;
string y;
int z;
rec() {
flag = 0;
x = 0;
y = "";
z = 0;
}
};
bool operator<(rec a, rec b) {
if (a.flag != b.flag)
return a.flag < b.flag;
if (a.x != b.x)
return a.x < b.x;
if (a.y != b.y)
return a.y < b.y;
return a.z < b.z;
}
rec v[100];
map<rec, rec> a[100000];
string s;
int n;
int zhan[100000];
int used[100000];
int used1[100000];
rec parsemap(int x, int y);
int dfs(int x) {
for (map<rec, rec>::iterator it = a[x].begin(); it != a[x].end(); it++) {
if (it->second.flag == 2) {
if (used[it->second.z] == 0) {
used[it->second.z] = 1;
used1[it->second.z] = 1;
if (dfs(it->second.z)) return 1;
used1[it->second.z] = 0;
}
else if (used1[it->second.z] == 1) return 1;
}
}
return 0;
}
int test(int x) {
int top, bottom;
top = 0;
bottom = 1;
memset(used, 0, sizeof(used));
memset(used1, 0, sizeof(used1));
used[x] = 1;
used1[x] = 1;
return dfs(x);
}
rec parsekey(int x, int y) {
rec p;
while (s[x] == ' ') x++;
while (s[y] == ' ') y--;
if (s[x] == '\'') {
p.flag = 1;
p.x = 0;
p.y = s.substr(x + 1, y - x - 1);
p.z = 0;
}
else {
p.flag = 0;
p.x = atoi(s.substr(x, y - x + 1).c_str());
p.y = "";
p.z = 0;
}
return p;
}
pair<rec, rec> parsepair(int x, int y) {
pair<rec, rec> ans;
int i;
for (i = x; i <= y; i++)
if (s[i] == ':') break;
ans.first = parsekey(x, i - 1);
i++;
for (; i <= y; i++)
if (s[i] != ' ') break;
if (s[i] == '{') {
ans.second = parsemap(i, y);
}
else {
ans.second = parsekey(i, y);
}
return ans;
}
rec parsemap(int x, int y) {
int i, j, prev, cnt;
pair<rec, rec> tmp;
rec ans;
ans.flag = 2;
ans.x = 0;
ans.y = "";
ans.z = n;
n++;
cnt = 0;
for (i = x; i <= y; i++)
if (s[i] != ' ') cnt++;
if (cnt == 2) {
return ans;
}
j = 0;
i = x + 1;
prev = x;
while (1) {
for (; i < y; i++) {
if (s[i] == '{') j++;
if (s[i] == '}') j--;
if ((j == 0) && (s[i] == ',')) break;
}
tmp = parsepair(prev + 1, i - 1);
a[ans.z][tmp.first] = tmp.second;
if (i == y) {
break;
}
prev = i;
i++;
}
return ans;
}
pair<int, rec> parseleft(int x, int y) {
pair<int, rec> p;
rec q;
int i, l, r;
for (i = x; i <= y; i++) if (s[i] != ' ') break;
p.first = s[i] - 'a';
p.second.flag = -1;
p.second.x = 0;
p.second.y = "";
p.second.z = 0;
while (1) {
i++;
for (; i <= y && i < s.length(); i++)
if (s[i] == '[') break;
l = i;
for (; i <= y && i < s.length(); i++)
if (s[i] == ']') break;
r = i;
if (i > y) break;
q = parsekey(l + 1, r - 1);
if (p.second.flag == -1) {
p.first = v[p.first].z;
p.second = q;
}
else {
p.first = a[p.first][p.second].z;
p.second = q;
}
}
return p;
}
rec parseright(int x, int y) {
rec ans;
while (s[x] == ' ') x++;
while (s[y] == ' ') y--;
if ((s[x] >= 'a') && (s[x] <= 'z')) {
pair<int, rec> tmp = parseleft(x, y);
if (tmp.second.flag == -1) {
ans.flag = 2;
ans.x = 0;
ans.y = "";
ans.z = v[tmp.first].z;
}
else {
ans = a[tmp.first][tmp.second];
}
return ans;
}
if (s[x] == '{') {
ans = parsemap(x, y);
return ans;
}
ans = parsekey(x, y);
return ans;
}
int main() {
int i, p;
char ss[300];
n = 0;
for (i = 0; i < 26; i++)
v[i].z = -1;
while (1) {
ss[0] = 0;
gets_s(ss);
if (ss[0] == 0) break;
s = ss;
p = s.find_first_of('=');
if (p == -1) {
p = s.find_first_of('(');
pair<int, rec> tmp = parseleft(p + 1, s.length() - 2);
int ind;
if (tmp.second.flag == -1)
ind = v[tmp.first].z;
else
ind = a[tmp.first][tmp.second].z;
if (s[0] == 'l') {
printf("%d\n", a[ind].size());
}
else {
printf("%d\n", test(ind));
}
}
else {
p = s.find_first_of('=');
pair<int, rec> tmp = parseleft(0, p - 1);
if (tmp.second.flag == -1)
v[tmp.first] = parseright(p + 1, s.length() - 1);
else
a[tmp.first][tmp.second] = parseright(p + 1, s.length() - 1);
}
}
return 0;
}
:
0.0分
8 人评分
2006年春浙江省计算机等级考试二级C 编程题(1) (C语言代码)浏览:912 |
C语言程序设计教程(第三版)课后习题6.4 (C语言代码)浏览:674 |
C语言程序设计教程(第三版)课后习题8.9 (Java代码)浏览:1413 |
母牛的故事 (C语言代码)浏览:478 |
数组输出 (C语言代码)错误???浏览:602 |
打水问题 (C语言代码)浏览:1148 |
兰顿蚂蚁 (C++代码)浏览:1160 |
WU-输入输出格式练习 (C++代码)浏览:1133 |
WU-C语言程序设计教程(第三版)课后习题11.12 (C++代码)(想学链表的小伙伴可以看看)浏览:964 |
WU-C语言程序设计教程(第三版)课后习题12.1 (C++代码)浏览:1024 |