201709
- emm就按照题意模拟一下就可以。
注意点:将事件处理为结构体,而非钥匙。即取钥匙和还钥匙间不要有结构联系。
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]
(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;
}