201709-3 CSP认证 JSON查询

不知道哪里出问题,一直得90。

建立一个树形结构的话,每次递归查询,建树过程要用到栈 ,{ 入栈, } 出栈,看似很简单一个题,就是拿不到100。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int MAXN = 2e5+5;
vector<int>v[MAXN];
string mp[MAXN],mp2[MAXN];
int vis[MAXN];
string s = "";
int n,m,tot = 1;
string que[MAXN];
int q_tot = 0;

string fun(int &i,int len)
{
    string k = "";
    for(int j=i;j<len;j++){
        if(s[j] == '\"' && s[j-1]!='\\'){
            i = j;
            break;
        }
        else k += s[j];
    }
    return k;
}
string fun2(string k)
{
    string ret = "";
    int len = k.size();
    for(int i=0;i<len;i++){
        if(k[i] == '\\'){
            ret += k[i+1];
            i++;
        }
        else ret += k[i];
    }
    return ret;
}
int f = 0;
int no_id;
void dfs(int x,int fa,int step)
{
    if(step == q_tot+1){
        if(vis[x]){
            f = 1;
            no_id = x;
        }
        else {
            f = 2;
        }
        return ;
    }
    int len = v[x].size();
    for(int i=0;i<len;i++){
        int to = v[x][i];
        if(to == fa)continue;
        if(mp[to] == que[step]){
            dfs(to,x,step+1);
        }
    }
}
int main()
{
    cin>>n>>m;
    getchar();
    s += "{";
    for(int i=1;i<=n;i++){
        string k;
        getline(cin,k);
        int len = k.size();
        for(int j = 0;j<len;j++)
            if(k[j]!=' ')s += k[j];
    }
    s += "}";
    int len = s.size();
    stack<int>ss;
    ss.push(tot);
    for(int i=0;i<len;i++){
        if(s[i] == '\"' ){
            i++;
            string k = fun(i,len);
            int fa = ss.top();
            mp[++tot] = fun2(k);
           // cout<<fa<<" = "<<tot<<endl;
           // cout<<mp[tot]<<" **** "<<endl;
            v[fa].push_back(tot);
        }
        if(s[i] == ':' && s[i+1] == '\"'){
            i+=2;
            string k = fun(i,len);
            mp2[tot] = fun2(k);
            vis[tot] = 1;
        }
        if(s[i] == ',')
            continue;
        if(s[i] == '{')
            ss.push(tot);
        if(s[i] == '}')
            ss.pop();
    }
    while(m--)
    {
        q_tot = 0;
        string s1,k = "";
        getline(cin,s1);
        int len = s1.size();
        for(int i=0;i<=len;i++){
            if(s1[i] == '.'||i == len){
                que[++q_tot] = k;
                k = "";
            }
            else {
                k += s1[i];
            }
        }
        f = 0;
        dfs(1,1,1);
        if(f == 0){
            cout<<"NOTEXIST"<<endl;
        }
        if(f == 1){
            cout<<"STRING "<<mp2[no_id]<<endl;
        }
        if(f == 2){
            cout<<"OBJECT"<<endl;
        }
    }
}
/*
10 7
{
"firstName": "John",
"lastName": "Smith",
"address": { "a":"axa",
"streetAddress": {"a":"2ndStreet","b":{"c":"d"},{}},
"city": "NewYork",
"state": "NY"
},
"esc\\aped": "\"hello\""
}
firstName
address
address.city
address.postal
esc\aped
address.streetAddress.b.c
*/

猜你喜欢

转载自blog.csdn.net/qq_41645482/article/details/104448299
今日推荐