【CCF CSP】201709

201709

  1. emm就按照题意模拟一下就可以。
  2. 注意点:将事件处理为结构体,而非钥匙。即取钥匙和还钥匙间不要有结构联系。

    struct Event{
        int n, opt, t;
        Event(){}
        bool operator<(const Event& eve)const
        {
            if(t!=eve.t) return t<eve.t;
            if(opt!=eve.opt) return opt>eve.opt;    //0 na 1 huan
            return n<eve.n;
        }
    }ev[2004]
    
  3. (1)思路:

    首先,将描述的数据进行解析,过滤掉不必要的空格和引号,存在一个string变量中
    然后,根据查询语句的不同层级用vector结构进行解析 
    最后,查询
    

    (2)注意点:

    题目保证没有空串;
    坑点,输入的JSON数据第一行可以是单独的 ‘{’,也有可能是 ‘{’ 和键值对,因此cin.get()的个数显得尤为重要!
    

    (3)贴上代码:JSON查询

#include <bits/stdc++.h>
#define I(a) scanf("%d", &a)
#define O(a) printf("%d", a)
#define mem(a, b) memset(a, b, sizeof(a))
using namespace std;

int n, m;
string json;

vector<string> resolve(string str)
{
    size_t pos = str.find(".");
    vector<string> res;
    while(pos != string::npos)
    {
        res.push_back(str.substr(0, pos));
        str = str.substr(pos+1);
        pos = str.find(".");
    }
    res.push_back(str);
    return res;
}

void SubStr(string &str, int left)
{
    int right=left;int pcnt=1;
    while(pcnt)
    {
        if(str[right]=='{') pcnt++;
        if(str[right]=='}') pcnt--;
        right++;
    }
    str = str.substr(left, right-left-1)+",";
}

bool isRoot(string& str, int pos)
{
    int pcnt=0;
    for(int i=0;i<pos;i++)
    {
        if(str[i]=='{') pcnt++;
        else if(str[i]=='}') pcnt--;
    }
    return pcnt==0;
}
void search(vector<string> &res, string str)
{
    size_t i = 0;
    while(i<res.size()-1)
    {
        size_t pos=str.find(res[i]+":{");
        if(pos==string::npos || !isRoot(str, pos))
        {
            cout<<"NOTEXIST"<<endl;
            return;
        }
        SubStr(str, pos+res[i].size()+2);
        i++;
    }
    size_t pos = str.find(res.back()+":");
    if(pos==string::npos || !isRoot(str, pos))
    {
        cout<<"NOTEXIST"<<endl;
     } 
    else{
        i = pos+res.back().size()+1;
        if(str[i]=='{')
        {
            cout<<"OBJECT"<<endl;
        }
        else{
            size_t tt=str.find(",", i);
            cout<<"STRING ";
            for(int j=i;j<tt; j++) cout<<str[j];
            cout<<endl;
        }
    }
}

int main()
{
//  freopen("aaa.txt","r",stdin);
    char ch;
    I(n), I(m);
    cin.get();  //get()读入一个字符
    cin.get();
    for(int i=0;i<n;i++)
    {
        while((ch=cin.get())!='\n')
        {
            if(ch=='"'||ch==' ') continue;
            if(ch=='\\') 
            {
                json+=cin.get();
                continue;
            }
            json += ch;
        }
    }
    json[json.length()-1]=',';

    for(int i=0;i<m;i++)
    {
        string str;
        cin>>str;
        vector<string> res=resolve(str);
        search(res, json);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_34898866/article/details/79592227