CCF-CSP 201709-3 JSON照会問題解
34127 ワード
試験問題番号:
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": "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"}は1層構造のオブジェクトであり,{"a":{"b":"c"}}は2層構造のオブジェクトであるとする.
まず、このテーマは伝統的なCCF-CSPのテーマほど長くありません.
数年前のテーマのせいか
これはシミュレーションの問題だから
だからブロガーは直接コードをつけます
詳しい注釈に合わせてよく理解するはずです
1 //Author:LanceYu
2 #include
3 #include<string>
4 #include
5 #include
6 #include
7 #include
8 #include
9 #include
10 #include
11 #include<set>
12 #include
13 #include
14 #include
15 #include
16 #include
17 #include
18 #include
19 #define ll long long
20 using namespace std;
21 const double clf=1e-8;
22 //const double e=2.718281828;
23 const double PI=3.141592653589793;
24 const int MMAX=2147483647;
25 const int mod=1e9+7;
26 //priority_queuep;
27 //priority_queue,greater >pq;
28 char a[10001],b[10001];//
29 int main()
30 {
31 //freopen("C:\\Users\\LENOVO\\Desktop\\in.txt","r",stdin);
32 //freopen("C:\\Users\\LENOVO\\Desktop\\out.txt","r",stdin);
33 int n,k;
34 scanf("%d%d",&n,&k);
35 getchar();
36 int i=0,j=0,flag=0,t,len,head=0,count,sum=0;
37 char c;
38 while(1)
39 {
40 c=getchar();
41 if(c==' ')
42 continue;
43 else if(c=='
')
44 flag++;
45 else a[i++]=c;
46 if(flag==n)
47 break;
48 }//
49 len=strlen(a);
50 j=0;
51 for(i=0;i)
52 {
53 if(a[i]=='\\'&&(a[i+1]=='\\'||a[i+1]=='"'))
54 b[j++]=a[++i];
55 else if(a[i]!='"')
56 b[j++]=a[i];
57 }// \\ \" ,
58 len=strlen(b);
59 //puts(b);
60 string s,str[81];//s ,str
61 while(k--)
62 {
63 cin>>s;
64 int q=0;//q Object String
65 int len2=s.length();
66 int w=0;// ,
67 for(i=0;i)
68 {
69 if(s[i]=='.')
70 {
71 w++;
72 break;
73 }
74 }
75 if(!w)//
76 {
77 for(i=0;i)
78 {
79 flag=0;
80 for(j=0;j)
81 {
82 if(b[i+j]==s[j])
83 flag++;
84 }//
85 if(flag==len2)
86 {
87 sum=0;
88 for(j=1;j)
89 {
90 if(b[j]=='{')
91 sum++;
92 else if(b[j]=='}')
93 sum--;
94 }
95 if(sum)// { } ( ),
96 continue;
97 int bz=0;//bz OBJECT STRING
98 if(b[i+len2]==':'&&b[i+len2+1]=='{')
99 bz=2;// :{ , OBJECT
100 else if(b[i+len2]==':')
101 {
102 bz=1;// , : STRING
103 head=i+len2+1;//head STRING
104 }
105 if(j==len)
106 t=j;
107 if(bz==2)
108 {
109 q=1;
110 printf("OBJECT
");
111 }
112 else if(bz==1)
113 {
114 q=1;
115 printf("STRING ");
116 for(j=head;b[j]!=','&&b[j]!='}';j++)
117 putchar(b[j]);
118 putchar('
');
119 }
120 }
121 }
122 if(!q)// OBJECT STRING
123 printf("NOTEXIST
");
124 }
125 else
126 {
127 count=1;
128 for(i=0;i)
129 {
130 if(s[i]=='.')
131 {
132 s[i]=' ';//
133 count++;
134 }
135 }
136 istringstream ss(s);
137 for(i=0;i)
138 ss>>str[i];//
139 t=0;
140 for(int l=0;l//l
141 {
142 len2=str[l].length();
143 for(i=t;i//i
144 {
145 flag=0;
146 for(j=0;j)
147 {
148 if(b[i+j]==str[l][j])
149 flag++;
150 }//
151 if(flag==len2&&b[i+len2]==':'&&b[i+len2+1]=='{'&&l!=count-1)
152 {
153 if(l==0)
154 head=i+len2;//head
155 t=i+len2+2;//t
156 break;
157 }
158 else if(flag==len2&&b[i+len2]==':'&&l==count-1&&b[i+len2+1]!='{')
159 {
160 sum=0;
161 for(j=head-1;j)
162 {
163 if(b[j]=='{')
164 sum++;
165 else if(b[j]=='}')
166 sum--;
167 }
168 if(sum!=count-1)// , count-1 , string , ,
169 continue;
170 printf("STRING ");
171 q=1;
172 for(j=i+len2+1;b[j]!=','&&b[j]!='}';j++)
173 putchar(b[j]);
174 putchar('
');
175 break;
176 }
177 else if(flag==len2&&b[i+len2]==':'&&l==count-1&&b[i+len2+1]=='{')// :{ OBJECT
178 {
179 printf("OBJECT
");
180 q=1;
181 break;
182 }
183 }
184 }
185 if(!q)
186 printf("NOTEXIST
");
187 }
188 }
189 return 0;
190 }
このコードはAC可能であるが,依然として大きなバグが存在する.
例えば:{組み合わせの判断自体が厳密ではありません.二重引用符の中には完全に現れる可能性があります:{組み合わせ、これは非常に正常な現象です.
同時に}判断も同じです
文字列の分解時に二重引用符を保持する必要があります
具体的な操作はもう余計なことは言わない
2019-02-19 06:36:50 Author:LanceYu