1. 程式人生 > >CCF JSON查詢

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

 ≤ 100,每個查詢的長度不超過 80 個字元。   字串中的字元均為 ASCII 碼 33-126 的可列印字元,不會出現空格。所有字串都不是空串。   所有作為鍵的字串不會包含小數點 .。查詢時鍵的大小寫敏感。   50%的評測用例輸入的物件只有 1 層結構,80%的評測用例輸入的物件結構層數不超過 2 層。舉例來說,{"a": "b"} 是一層結構的物件,{"a": {"b": "c"}} 是二層結構的物件,以此類推。

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