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