CCF 201709-3 JSON查询 100分

Posted 登登登ccc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CCF 201709-3 JSON查询 100分相关的知识,希望对你有一定的参考价值。

题目来源:- 计算机软件能力认证考试系统

思路:采用regex类处理,首先把输入的字符串合并到一起,再按照自己的需求通过regex类拆分,进行递归处理。

#include<bits/stdc++.h>

using namespace std;

stringstream ss;
unordered_map<string,string> ans;

bool handle(string key) 
	string value;
	ss>>value;
	if(value == "")
		return false;

	if(value == "") 
		if(key != "")
			ans[key]="";  //该键对应的值是一个object
		while(handle(key)); //递归处理直到当前里的字符串处理完
	 else 
		string v=value.substr(1, value.rfind('"')-1);

		if(value.back() == ':')  //back()返回末尾字符:,表示该字符串是键
			handle((key == "") ? v : (key+"."+v));  //如果key存在,就继承key原来的值
		else
			ans[key]=v;
	
	return true;


int main() 

	int a,b;
	cin>>a>>b;
	getchar();

	string s="";
	while(a--) 
		string line;

		getline(cin,line);
		s+=line;
	
	s=regex_replace(s, regex(" "), "");
	s=regex_replace(s, regex("\\\\\\\\\\""), "\\"");   //将\\"转换为"(\\\\"代表")
	s=regex_replace(s, regex("\\\\\\\\\\\\\\\\"),"\\\\");  //将\\\\转换为\\(\\\\\\代表\\)
	s=regex_replace(s, regex(","), ", ");        //在每个,字符后添加一个空格字符
	s=regex_replace(s, regex(":"), ": ");        //在每个:字符后添加一个空格字符
	s=regex_replace(s, regex("\\\\"), "  ");     //在每个字符左右均添加空格字符(''要转义)
	s=regex_replace(s, regex(",?"), "  ");     //将,转换为('?'要求','出现0次或1次)
	ss<<s;

	handle("");//递归处理

	while(b--) 
		cin>>s;
		if(ans.find(s) == ans.end()) //fina()查询不到会返回end()值
			cout<<"NOTEXIST"<<endl;
		else if(ans[s] == "")
			cout<<"OBJECT"<<endl;
		else
			cout<<"STRING "<<ans[s]<<endl;
	
	return 0;

C++正则表达式知识可参考以下内容:

C++正则表达式_HesseSummer的博客-CSDN博客_c++正则表达式

C++正则表达式_monk1992的博客-CSDN博客

以上是关于CCF 201709-3 JSON查询 100分的主要内容,如果未能解决你的问题,请参考以下文章

CCF 201709-3 JSON查询 100分

CCF 201709-3 JSON查询 100分

CCF 201709-3 JSON查询

CCF 201709-3 JSON查询

CCF-CSP题解 201709-3 JSON查询

CCF-CSP刷题库11-18