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;
}

原文地址:https://www.cnblogs.com/acboyty/p/11369478.html

时间: 2024-08-02 10:53:48

CCF-CSP题解 201709-3 JSON查询的相关文章

ccf csp题解201312-1

试题编号: 201312-1 试题名称: 出现次数最多的数 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 给定n个正整数,找出它们中出现次数最多的数.如果这样的数有多个,请输出其中最小的一个. 输入格式 输入的第一行只有一个正整数n(1 ≤ n ≤ 1000),表示数字的个数. 输入的第二行有n个整数s1, s2, -, sn (1 ≤ si ≤ 10000, 1 ≤ i ≤ n).相邻的数用空格分隔. 输出格式 输出这n个次数中出现次数最多的数.如果这样的数有多个,输

ccf 201709-3 JSON查询

ccf 201709-3 JSON查询  解题思路: 首先,先逐行读入n行数据,因为数据中会经常出现 空格 或者是 换行,所以,我们遇到空格和换行就忽略,同时将转义字符进行处理,将n行数据存入一个一维数组中.由于"n ≤ 100,每行不超过 80 个字符.m ≤ 100,每个查询的长度不超过 80 个字符",所以我们可以将一位数组的大小设置为100*80,我偷了个懒直接设置了一维数组 in[maxn * maxn]. 接着需要构造一个映射,即做一个 string->string

JS 实现Json查询的方法实例

其实很简单,我这部分代码,前一部分是简单的实现如何使用JS写模板,第二个就是具体的实现了JSON查询的一个扩展. 以后查询Json就有了利器了. 代码如下: /*         * 定义模板函数        */        var template = function (queryArr) { var count = 0; for (var i = 0; i < queryArr.length; i++) { var e = queryArr[i]; if ($express) {  

CCF CSP 201712-2 游戏

题目链接:http://118.190.20.162/view.page?gpid=T67 问题描述 有n个小朋友围成一圈玩游戏,小朋友从1至n编号,2号小朋友坐在1号小朋友的顺时针方向,3号小朋友坐在2号小朋友的顺时针方向,……,1号小朋友坐在n号小朋友的顺时针方向. 游戏开始,从1号小朋友开始顺时针报数,接下来每个小朋友的报数是上一个小朋友报的数加1.若一个小朋友报的数为k的倍数或其末位数(即数的个位)为k,则该小朋友被淘汰出局,不再参加以后的报数.当游戏中只剩下一个小朋友时,该小朋友获胜.

【题解】[CJOI2019] 树上查询(树状数组)

[题解][CJOI2019] 树上查询(树状数组) 题目描述 班?小 A 需要管理信息组的日常纪律.所有人都在树形机房学习,树形机房的根节点为 1 .信息组的同学很多,但树 形机房的每个节点上有且仅有一个同学.小 A 的位置在树形机房的某个节点上,他想要管理在他所站节点子树中的同学(不算自己).每个位置都有一个管理容易值\(w_i\) ,他能管理到某个位置 ,当且仅当他们的距离不超过\(w_i\). 定位一个根\(x\),现在就是求\(u\in S\),\(S\)是\(x\)的所有子树所有节点集

记第十七次CCF CSP认证

记第十七次CCF CSP认证 第一二题很简单,就是简单的模拟就可以了,后面的第三四题用了近一个小时才看懂,但是感觉好复杂,不好写,能力不行,写不出来.第五题,就想到了暴力,其他就不会了,但是我没有去写,因为感觉这个复杂度就算写了也过不了.最后检查了几遍第一二题的代码,范围我开的都比题目要求的大一个数量级.最后就过了这两个题. 下次12月份继续! 原文地址:https://www.cnblogs.com/alking1001/p/11536021.html

MySQL全文索引、联合索引、like查询、json查询速度大比拼

查询背景 有一个表tmp_test_course大概有10万条记录,然后有个json字段叫outline,存了一对多关系(保存了多个编码,例如jy1577683381775) 我们需要在这10万条数据中检索特定类型的数据,目标总数据量:2931条 SELECT COUNT(*) FROM tmp_test_course WHERE `type`=5 AND del=2 AND is_leaf=1 我们在限定为上面类型的同时,还得包含下面任意一个编码(也就是OR查询) jy157768338177

CCF CSP个人题解汇总

趁着这波考CCF热来骗一波访问量 祝自己免修算法RP++ 区域赛RP++ 1.2题汇总在这:https://www.cnblogs.com/QAQorz/p/9650890.html 201803-4 棋局评估(对抗搜索):https://www.cnblogs.com/QAQorz/p/9650828.html 201712-4 行车路线(最短路):https://www.cnblogs.com/QAQorz/p/9588268.html 原文地址:https://www.cnblogs.co

201709-3 JSON查询

问题描述 JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式,可以用来描述半结构化的数据.JSON 格式中的基本单元是值 (value),出于简化的目的本题只涉及 2 种类型的值: * 字符串 (string):字符串是由双引号 " 括起来的一组字符(可以为空).如果字符串的内容中出现双引号 ",在双引号前面加反斜杠,也就是用 \" 表示:如果出现反斜杠 \,则用两个反斜杠 \\ 表示.反斜杠后面不能出现 " 和 \ 以外