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

猜你喜欢

转载自www.cnblogs.com/acboyty/p/11369478.html