CCF-CSP题解 201709-3 JSON查询
Posted acboyty
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CCF-CSP题解 201709-3 JSON查询相关的知识,希望对你有一定的参考价值。
要求写一个小程序完成JSON查询的功能。
查询dfs就好了。
存储JSON对象用图(树)就好,把\\(<key[],type,val[]>\\)作为节点,然后又是字符串处理了。
其实就是个简化版的201809-3元素选择器。
虽然说80%的评测用例对象层数不超过2层,但是经测试,凉心出题人评测用例最多的层数是20层。
#include <bits/stdc++.h>
const int maxn = 100;
using namespace std;
struct tNode
char key[85];
int type; // 0 STRING 1 OBJECT
char val[85];
;
tNode node[maxn*10+5];
int to[maxn*10+5];
int nex[maxn*10+5];
int head[maxn*10+5], cnt = 0;
void addedge(int a, int b)
to[cnt] = b; nex[cnt] = head[a];
head[a] = cnt++;
char query[50][85];
int queCnt;
bool dfs(int x, int y)
// printf("%s %s\\n", node[x].key, query[y]);
if (strcmp(node[x].key, query[y]) == 0)
if (y == queCnt - 1)
if (node[x].type == 0)
printf("STRING %s\\n", node[x].val);
else
printf("OBJECT\\n");
return true;
else
for (int i = head[x]; i != -1; i = nex[i])
if (dfs(to[i], y + 1))
return true;
return false;
else
return false;
int main()
int n, m;
scanf("%d%d", &n, &m);
getchar();
memset(head, -1, sizeof(head));
stack<int> sta;
int num = 0;
char key[85] = "", val[85] = "";
while (n--)
char str[85];
scanf("%[^\\n]", str);
getchar();
for (int i = 0; str[i] != '\\0'; i++)
if (str[i] == '')
strcpy(node[num].key, key);
node[num].type = 1;
if (!sta.empty())
addedge(sta.top(), num);
sta.push(num++);
strcpy(key, "");
else if (str[i] == '"')
char temp[85], tempCnt = 0;
for (i = i + 1; str[i] != '"'; i++)
if (str[i] == '\\\\')
temp[tempCnt++] = str[++i];
else
temp[tempCnt++] = str[i];
temp[tempCnt] = '\\0';
if (strcmp(key, "") == 0)
strcpy(key, temp);
else
strcpy(val, temp);
strcpy(node[num].key, key);
strcpy(node[num].val, val);
node[num].type = 0;
addedge(sta.top(), num++);
strcpy(key, "");
else if (str[i] == '')
sta.pop();
while (m--)
char str[85];
scanf("%s", str);
queCnt = 0;
strcpy(query[queCnt++], "");
for (int i = 0; ; i++)
int tmp = 0;
int j = i + 1;
for (; str[j] != '.' && str[j] != '\\0'; j++);
for (; i < j; i++)
query[queCnt][tmp++] = str[i];
query[queCnt++][tmp] = '\\0';
if (str[j] == '\\0')
break;
if (!dfs(0, 0))
printf("NOTEXIST\\n");
return 0;
以上是关于CCF-CSP题解 201709-3 JSON查询的主要内容,如果未能解决你的问题,请参考以下文章