CCF 201709-3 JSON照会(100点)


試験問題番号:
201709-3
試験問題名:
JSON照会
時間制限:
1.0s
メモリの制限:
256.0MB
問題の説明:
問題記述JSON(JavaScript Object Notation)は、半構造化されたデータを記述するために使用できる軽量レベルのデータ交換フォーマットです.JSON形式の基本単位は値(value)であり、簡略化の目的で本題は2種類の値のみを含む:*文字列(string):文字列は二重引用符で囲まれた文字のセット(空でもよい).文字列の内容に二重引用符が表示された場合、二重引用符の前に反スラッシュを付ける.つまり、で表します.反スラッシュが表示された場合は、2つの反スラッシュ\で表します.反スラッシュの後ろには表示されません.たとえば、「」、「hello」、""\".*オブジェクト(object):オブジェクトは、キー値ペアの無秩序なセットです(空でもかまいません).キー値ペアは、オブジェクトのプロパティを表し、キーはプロパティ名、値はプロパティの内容です.オブジェクトは左かっこ{で始まり、右かっこ}最後に、キー値ペア間をカンマで区切ります.キー値のペアのキーと値の間には、コロン:区切ります.キーは文字列でなければなりません.同じオブジェクトのすべてのキー値ペアのキーは2つとも異なる必要があります.値は文字列でも別のオブジェクトでもかまいません.例:{},{「foo」:「bar」},{「Mon」:「weekday」,「Tue」:「weekday」,「Sun」:「weekend」}.文字列の内部の位置を除いて、他の位置に1つ以上のスペースを挿入することで、JSONの表示がより美しくなり、一部の場所で改行することもでき、表示されたデータの内容に影響を与えません.例えば、上述した最後のJSONデータは、以下のように書くこともできる.{"Mon":"weekday","Tue":"weekday","Sun":"weekend"}は、JSON形式で記述されたデータと、いくつかのクエリーを提供し、これらのクエリーの結果をプログラミングして返します.入力フォーマットの1行目は2つの正の整数nとmであり、それぞれJSONデータの行数とクエリの個数を表す.次にn行は、入力が正当なJSONオブジェクトであることを保証するJSONデータを記述する.次にm行で、各行にクエリーが記述されます.クエリーするプロパティ名を指定し、対応するプロパティの内容を返す必要があります.多層クエリーをサポートする必要があり、各層の属性名の間に小数点を用いる.接続.クエリーのフォーマットが合法であることを保証します.出力フォーマット入力された各クエリーに対して、クエリー結果が順次出力され、各結果が1行を占めます.クエリの結果が文字列である場合、STRINGが出力されます.ここでは文字列の値であり、中央はスペースで区切られます.クエリ結果がオブジェクトである場合、オブジェクトの内容を出力する必要がないOBJECTが出力されます.クエリ結果が存在しない場合、NOTEXISTが出力されます.サンプル入力10 5{"firstName":"John","lastName":"Smith","address":{"streetAddress":"2 ndStreet","city":"NewYork","state":"NY"},"esc\aped":""hello""}firstName address.city address.postal escapedサンプル出力STRING John OBJECT STRING NewYork NOTEXIST STRING“hello”評価用例規模と約束n≦100、1行80文字を超えない.m≦100で、各クエリの長さは80文字を超えない.文字列の文字はすべてASCIIコード33-126の印刷可能な文字で、スペースは表示されません.すべての文字列は空欄ではありません.キーとしての文字列には小数点は含まれません.クエリー時のキーの大文字と小文字は敏感です.50%の評価用例入力の対象は1層構造のみであり、80%の評価用例入力の対象構造層数は2層を超えない.たとえば,{"a":"b"}は1層構造のオブジェクトであり,{"a":{"b":"c"}}は2層構造のオブジェクトであるとする.
問題接続:CCF 201709-3 JSON照会
問題を解く構想:問題の意味によってシミュレーションして、具体的にプログラムの注釈を見ます
提出後100点を得たC++プログラム:
第1版(時間:2018.08.07)第2版をお勧めしますよ
#include
#include
#include
#include 
#include

using namespace std;

const int N=1001;

struct JSON{
	mapstr;//      
	mappos;//  JSON  ,        object       
}object[N];
int k;	//       object   

void read(int n)//  n    
{
	stacks;//    
	k=0; 
	char c;
	while(c=getchar())
	{
		if(c=='{')
		  s.push("{");
		else if(c=='
') { n--; if(n==0) break;// n , } else if(c=='"')// { bool flag=false;// string word=""; while(c=getchar()) { if(c=='"')// { if(flag)// { word+=c; flag=false; } else// , break; } else if(c=='\\') { if(flag) { word+=c; flag=false; } else flag=true;// '\' } else word+=c; } s.push(word);// } else if(c=='}')// , { k++; while(s.size()>=2) { string val=s.top(); s.pop(); if(val=="{")// { // " k" , object k string p=" "; char ch=k; p=p+ch; s.push(p);// , break; } string key=s.top(); s.pop(); if(val[0]==' ')// { // int t=val[1]; object[k].pos[key]=t;// key t } else// object[k].str[key]=val;// } } } } void query() { queueq; char c; string demand=""; while((c=getchar())!='
') { if(c=='.') { q.push(demand); demand=""; } else demand+=c; } q.push(demand); // int t=k; bool flag=false;// while(!q.empty()) { demand=q.front(); q.pop(); if(object[t].str.count(demand)&&q.empty())// { flag=true;// cout<>n>>m; getchar(); read(n); while(m--) { query(); } return 0; }

第2版(時間:2019.03.12)
#include
#include
#include
#include
#include
#include

using namespace std;

const int N=1010;
mapd[N];//  JSON   

int n,m,t;

//      (        ,              ) 
string getword()
{
	string s="";
	char pre=0,cur;
	//               
	while(cur=getchar()) 
	{
		if(cur=='"')//       
		{
			if(pre=='\\')//         '"'    '\'   
			  s[s.length()-1]=cur; 
			else//            
			  break;
			pre=cur;//  pre 
		}
		else if(cur=='\\'&&pre=='\\')//        '\' 
		{
			pre=0;// pre=0        '\'    
		}
		else//             s    
		{
			s+=cur;
			pre=cur;
		}
	}
	return s;//        
}

void read()
{
	char ch;
	t=0;
	stackst; 
	while(ch=getchar())
	{
		if(ch=='
')// :'
' { if(--n==0) break;// n } else if(ch=='{')// :'{', { st.push("{"); } else if(ch=='"')// : '"', getword { st.push(getword());// } else if(ch=='}')// : '}' { t++; //t mapd[] while(st.size()>0)// 0 { string val=st.top(); st.pop(); if(val=="{") break;// '{' , string key=st.top(); st.pop(); d[t][key]=val;// d[t] , } // , , if(st.size()>0) st.push(string(t,' '));// t t } } } int main() { scanf("%d%d",&n,&m); getchar();// read();// JSON while(m--) { char s[100]; scanf("%s",s); vectorq;// char *sp=strtok(s,".");// '.' while(sp) { q.push_back(sp); sp=strtok(NULL,"."); } int i,k=t; // for(i=0;i