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查询的更多相关文章
- CCF CSP 201709-3 JSON查询
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201709-3 JSON查询 问题描述 JSON (JavaScript Object Not ...
- CCF CSP 201612-3 权限查询
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201612-3 权限查询 问题描述 授权 (authorization) 是各类业务系统不可缺 ...
- CCF 201709-3 JSON查询
CCF 201709-3 JSON查询 试题编号: 201709-3 试题名称: JSON查询 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 JSON (JavaScript ...
- CCF-CSP 201709-3 JSON查询 题解
试题编号: 201709-3 试题名称: JSON查询 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 JSON (JavaScript Object Notation) 是一 ...
- CCF(JSON查询:40分):字符串+模拟
JSON查询 201709-3 纯字符串模拟,考的就是耐心和细心.可惜这两样我都缺... #include<iostream> #include<cstdio> #includ ...
- CCF CSP 201403-2 窗口
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201403-2 窗口 问题描述 在某图形操作系统中,有 N 个窗口,每个窗口都是一个两边与坐标 ...
- CCF CSP 201703-3 Markdown
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201703-3 Markdown 问题描述 Markdown 是一种很流行的轻量级标记语言(l ...
- CCF CSP 201312-3 最大的矩形
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201312-3 最大的矩形 问题描述 在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i( ...
- CCF CSP 201609-3 炉石传说
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201609-3 炉石传说 问题描述 <炉石传说:魔兽英雄传>(Hearthston ...
随机推荐
- thinking in JAVA 编译记录
编辑/编译<thinking in JAVA>源代码 一.下载源代码 首先,我阅读的是<thinking in JAVA>第四版,因此按照书中提供的链接找到了mindview主 ...
- HTML的footer置于页面最底部
vue项目中,使用element-ui的布局,仍然出现footer不固定页面底部的情况,网上找到的一个管用的 方法是:footer高度固定+绝对定位 <html> <head> ...
- Spring Boot (一) 校验表单重复提交
一.前言 在某些情况下,由于网速慢,用户操作有误(连续点击两下提交按钮),页面卡顿等原因,可能会出现表单数据重复提交造成数据库保存多条重复数据. 存在如上问题可以交给前端解决,判断多长时间内不能再次点 ...
- 记录用户登陆信息,你用PHP是如何来实现的
对于初入门的PHP新手来说,或许有一定的难度.建议大家先看看PHP中session的基础含义,需要的朋友可以选择参考. 下面我们就通过具体的代码示例,为大家详细的介绍PHP中session实现记录用户 ...
- RocketMQ一个新的消费组初次启动时从何处开始消费呢?
目录 1.抛出问题 1.1 环境准备 1.2 消息发送者代码 1.3 消费端验证代码 2.探究CONSUME_FROM_MAX_OFFSET实现原理 2.1 CONSUME_FROM_LAST_OFF ...
- JavaScript实战实例剖析——(激励倒计时日历)
如今JavaScript在前端开发中的地位越来越高,掌握JavaScript的深度往往能决定你职业道路深远,这次通过制作 带着倒计时功能的激励日历的小实例,进一步细致的掌握JavaScript的语法与 ...
- Streams:深入理解Redis5.0新特性
概述 相较于Redis4.0,Redis5.0增加了很多新的特性,而streams是其中最重要的特性之一.streams是redis 的一种基本数据结构,它是一个新的强大的支持多播的可持久化的消息队列 ...
- MySQL 库、表、记录、相关操作(1)
库.表.记录.相关操作(1) 数据库配置 # 通过配置文件统一配置的目的:统一管理 服务端(mysqld) .客户端(client) # 配置了 mysqld(服务端) 的编码为utf8,那么再创建的 ...
- 【nodejs原理&源码赏析(7)】【译】Node.js中的事件循环,定时器和process.nextTick
目录 Event Loop 是什么? Event Loop 基本解释 事件循环阶段概览 事件循环细节 timers pending callbacks poll阶段 check close callb ...
- .Net Core Web Api使用模型验证验证参数合法性
在接口开发过程中免不了要去验证参数的合法性,模型验证就是帮助我们去验证参数的合法性,我们可以在需要验证的model属性上加上Data Annotations特性后就会自动帮我们在action前去验证输 ...