要求写一个小程序完成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查询的更多相关文章

  1. CCF CSP 201709-3 JSON查询

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201709-3 JSON查询 问题描述 JSON (JavaScript Object Not ...

  2. CCF CSP 201612-3 权限查询

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201612-3 权限查询 问题描述 授权 (authorization) 是各类业务系统不可缺 ...

  3. CCF 201709-3 JSON查询

    CCF 201709-3 JSON查询 试题编号: 201709-3 试题名称: JSON查询 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 JSON (JavaScript ...

  4. CCF-CSP 201709-3 JSON查询 题解

    试题编号: 201709-3 试题名称: JSON查询 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 JSON (JavaScript Object Notation) 是一 ...

  5. CCF(JSON查询:40分):字符串+模拟

    JSON查询 201709-3 纯字符串模拟,考的就是耐心和细心.可惜这两样我都缺... #include<iostream> #include<cstdio> #includ ...

  6. CCF CSP 201403-2 窗口

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201403-2 窗口 问题描述 在某图形操作系统中,有 N 个窗口,每个窗口都是一个两边与坐标 ...

  7. CCF CSP 201703-3 Markdown

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201703-3 Markdown 问题描述 Markdown 是一种很流行的轻量级标记语言(l ...

  8. CCF CSP 201312-3 最大的矩形

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201312-3 最大的矩形 问题描述 在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i( ...

  9. CCF CSP 201609-3 炉石传说

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201609-3 炉石传说 问题描述 <炉石传说:魔兽英雄传>(Hearthston ...

随机推荐

  1. react-router重定向

    ① ②通过this.props重定向

  2. mysql--时区表问题(Windows环境下)

    自己用Django开发个人博客是,数据库用的是mysql,期间遇到一个时间不一致的问题,具体解决过程: 1.问题原因:Windows没有时区表 2.去mysql官网下载相应版本的时区表:https:/ ...

  3. Theano 更多示例

    Logistic函数 logistic函数的图,其中x在x轴上,s(x)在y轴上. 如果你想对双精度矩阵上的每个元素计算这个函数,这表示你想将这个函数应用到矩阵的每个元素上. 嗯,你是这样做的: x= ...

  4. 异常:java.lang.RuntimeException: Canvas: trying to draw too large(161740800bytes) bitmap

    现象 今天做一个安卓项目的时候,我使用了10张图片,这10张图片都是放在了drawable目录下. 根据这个错误,我在网上寻找解决问题的方案,然后我放在了mipmap-xxhdpi下结果可以运行. 但 ...

  5. 【漏洞复现】Apache Solr远程代码执行(CVE-2019-0193)

    0x01 概述 Solr简介 Apache Solr 是一个开源的企业级搜索服务器.Solr 使用 Java 语言开发,主要基于 HTTP 和 Apache Lucene 实现.Apache Solr ...

  6. Maven搭建SpringMvc

    Maven搭建SpringMvc,只需跟着一步步操作 项目结构 1 创建Maven项目 index,jsp报错不用管,配置完pom就好了,也可以直接删除掉 2 pom.xml添加依赖 <depe ...

  7. 你真的了解foreach吗?

    引言 有C#基础的,当问到循环有哪些,会毫不犹豫的说出的for.do while.foreach及while这几种,但是到具体实际开发中,我们遇到一些问题,比如:到底选择哪种?为什么选择这种?哪种好像 ...

  8. AJAX入门介绍

    在我们平时的开发过程中,经常使用到Ajax数据交互,相信有很大一部分人会使用,可能没太详细了解过Ajax的工作原理.下面我们一起看一下吧! ( 一 ) 什么是Ajax Ajax 即“Asynchron ...

  9. unicode和utf-8编码区别

    以前使用Python2,一直为中文烦恼,也不知道为什么开头就要声明#coding=utf-8,后来用了Python3,发现就不用这样了,还是想彻底弄懂下这是为什么. 先讲asc码  每个 ASC码占一 ...

  10. Head First设计模式——迭代器模式

    前言:迭代器模式平时用的不多,因为不管C#还是Java都已经帮我封装了,但是你是否知道平时经常在用的东西本质是怎么回事呢. 看完迭代器模式你就知道C# foreach循环是怎么实现的了,我的另一篇C# ...