CCF JSON查詢
問題描述
JSON (JavaScript Object Notation) 是一種輕量級的資料交換格式,可以用來描述半結構化的資料。JSON 格式中的基本單元是值 (value),出於簡化的目的本題只涉及 2 種類型的值: * 字串 (string):字串是由雙引號 " 括起來的一組字元(可以為空)。如果字串的內容中出現雙引號 ",在雙引號前面加反斜槓,也就是用 \" 表示;如果出現反斜槓 \,則用兩個反斜槓 \\ 表示。反斜槓後面不能出現 " 和 \ 以外的字元。例如:""、"hello"、"\"\\"。 * 物件 (object):物件是一組鍵值對的無序集合(可以為空)。鍵值對錶示物件的屬性,鍵是屬性名,值是屬性的內容。物件以左花括號 { 開始,右花括號 } 結束,鍵值對之間以逗號 , 分隔。一個鍵值對的鍵和值之間以冒號 : 分隔。鍵必須是字串,同一個物件所有鍵值對的鍵必須兩兩都不相同;值可以是字串,也可以是另一個物件。例如:{}、{"foo": "bar"}、{"Mon": "weekday", "Tue": "weekday", "Sun": "weekend"}。 除了字串內部的位置,其他位置都可以插入一個或多個空格使得 JSON 的呈現更加美觀,也可以在一些地方換行,不會影響所表示的資料內容。例如,上面舉例的最後一個 JSON 資料也可以寫成如下形式。 { "Mon": "weekday", "Tue": "weekday", "Sun": "weekend" } 給出一個 JSON 格式描述的資料,以及若干查詢,程式設計返回這些查詢的結果。
輸入格式
第一行是兩個正整數 n 和 m,分別表示 JSON 資料的行數和查詢的個數。 接下來 n 行,描述一個 JSON 資料,保證輸入是一個合法的 JSON 物件。 接下來 m 行,每行描述一個查詢。給出要查詢的屬性名,要求返回對應屬性的內容。需要支援多層查詢,各層的屬性名之間用小數點 . 連線。保證查詢的格式都是合法的。
輸出格式
對於輸入的每一個查詢,按順序輸出查詢結果,每個結果佔一行。 如果查詢結果是一個字串,則輸出 STRING <string>,其中 <string> 是字串的值,中間用一個空格分隔。 如果查詢結果是一個物件,則輸出 OBJECT,不需要輸出物件的內容。 如果查詢結果不存在,則輸出 NOTEXIST。
樣例輸入
10 5 { "firstName": "John", "lastName": "Smith", "address": { "streetAddress": "2ndStreet", "city": "NewYork", "state": "NY" }, "esc\\aped": "\"hello\"" } firstName address address.city address.postal esc\aped
樣例輸出
STRING John OBJECT STRING NewYork NOTEXIST STRING "hello"
評測用例規模與約定
n ≤ 100,每行不超過 80 個字元。 m
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<string.h>
#include<map>
#include<queue>
using namespace std;
typedef long long ll;
int n,m;
map<string,string>mp;
int flag=0,staten=0;
string q="";
void deal(string& s){
for(int i=0;s[i];i++){
if(s[i]=='{'){
if(flag){
mp[q]="OBJECT";
flag=0;
}
}else if(s[i]==':'){
if(flag==0)flag=1;
}else if(s[i]==','){
flag=0;
int j;
for(j=q.size()-1;j>=0;j--){
if(q[j]=='.'){
break;
}
}
if(j<0)q="";
else q=q.substr(0,j);
}else if(s[i]=='}'){
flag=0;
int j;
for(j=q.size()-1;j>=0;j--){
if(q[j]=='.'){
break;
}
}
if(j<0)q="";
else q=q.substr(0,j);
}else if(s[i]=='"'){
string temp="";
for(i++; s[i]; i++) {
if(s[i] == '\\'){
temp += s[++i];
}
else if(s[i] == '"')
break;
else
temp += s[i];
}
if(flag==0){
if(q=="")q+=temp;
else q+="."+temp;
}
else {
mp[q]="STRING "+temp;
}
}
}
return ;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(false);
string ip;
cin>>n>>m;
getline(cin,ip);
while(n--){
getline(cin,ip);
deal(ip);
}
while(m--){
string ip;
cin>>ip;
if(mp[ip]==""){
cout<<"NOTEXIST"<<"\n";
}else cout<<mp[ip]<<"\n";
}
return 0;
}