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