试题编号: | 201709-3 |
试题名称: | JSON查询 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式,可以用来描述半结构化的数据。JSON 格式中的基本单元是值 (value),出于简化的目的本题只涉及 2 种类型的值: 输入格式 第一行是两个正整数 n 和 m,分别表示 JSON 数据的行数和查询的个数。 输出格式 对于输入的每一个查询,按顺序输出查询结果,每个结果占一行。 样例输入 10 5 样例输出 STRING John 评测用例规模与约定 n ≤ 100,每行不超过 80 个字符。 |
#include<iostream>
#include<vector>
using namespace std;
string para;//当查询为string时,记录string的值
int find(vector<string> vec,string str){
int num=0;string s="\""+vec[num]+"\":";//给要查询的变量名加上引号和冒号,防止查到相同的值产生冲突
int flag=-1;//标记大括号的层数
for(int i=0;i<str.size();i++){
if(str[i]=='{')flag++;//遇到{,层数+1
if(str[i]=='}'){//遇到},层数-1
flag--;
if(flag<num)return 0;//当前层数小于要查询的第几个数时,直接返回找不到
}
if(s==str.substr(i,s.size()) && flag==num){//当层数与字符均符合
num++;//要查询的第几个数+1
if(num>=vec.size()){//找完了 ,根据后面以为是{还是别的返回相应的类型
if(str[i+s.size()]=='{')return 1;
else{
int a=i+s.size(),b=i+s.size();
while(1){
if(str[b]==',' || str[b]=='}')break;
b++;
}
para=str.substr(a+1,b-a-2);
return 2;
}
}else{//还没找完
s="\""+vec[num]+"\":";//另当前要找的字符成为字符数组中的下一个
}
}
}
}
int main(){
string str,s;
int n,m;
cin>>n>>m;
getline(cin,s);
while(n--){
getline(cin,s);
for(int i=0;i<s.size();i++){//因为题目叙述为了美观,空格数不定,所以把每行加起来
if(s[i]=='\\')s.erase(i,1);//去除标记符号的斜杠
if(s[i]==' '){ //去除空格
s.erase(i,1);i--;
}
}
str+=s;
}
while(m--){
vector<string> vec;
cin>>s;
int i=0,j=0;
while(j<s.size()){
while(1){
if(j>=s.size())break;
if(s[j]=='.')break;
j++;
}
vec.push_back(s.substr(i,j-i));//把要查询的用.分割
j++;i=j;
}
int res=find(vec,str);//检查分割的查询数组是否能找到
if(res==0)cout<<"NOTEXIST"<<endl;
else if(res==1)cout<<"OBJECT"<<endl;
else cout<<"STRING "<<para<<endl;
}
}
更多相关CCF的试题解答,请点击>>CCF历年认证考试解答