这道题当时考ccf,五道题中做的时间最长的一道题....可惜最好只有0分!!

后来重现写了一下--(110行超级麻烦

主要思想:就是先对括号经行匹配,创建的时候分为创建表和创建元素两种情况,难点在于对字符串的分割

然而昨天在受到某婷的启发下,想用正则重写,发现正则不能实现递归括号匹配,最后用递归的方法重写了这道题.发现超级简单

只有50行....hh

递归版本:

 #include <bits/stdc++.h>
using namespace std;
map <string,string> mapp;
map <string,int> cls;
string str; int pos;
string get_name () {
string ans;
for (pos+=;str[pos]!='\"';pos++) {
if (str[pos]=='\\') pos++;
ans.push_back(str[pos]);
}
return ans;
}
void build (string _name) {
while (pos<str.size()&&str[pos]!='}') { // 不加pos<str.size()莫名错误90
pos++;
string s1=get_name(); cls[_name+s1]=;
pos+=;
if (str[pos]=='\"') {
string s2=get_name();
mapp[_name+s1]=s2;
cls[_name+s1]=;
}
else build(_name+s1+".");
pos++;
}
return ;
}
int main ()
{
int n,m; cin>>n>>m; getchar();
while (n--) {
string tmp; getline (cin,tmp);
str+=tmp;
}
string tmp=str; str="";
for (int i=;i<tmp.size();i++) {
if (tmp[i]==' ') continue;
str.push_back(tmp[i]);
}
build ("");
while (m--) {
getline (cin,tmp);
if (cls[tmp]==) cout<<"NOTEXIST\n";
else if (cls[tmp]==) cout<<"OBJECT\n";
else cout<<"STRING "<<mapp[tmp]<<"\n";
}
return ;
}

复杂版本:

 // 这个是一个只考虑了简单情况的程序
// 关键词字符串包含'{' ,',' ,':'都没有包含
#include <bits/stdc++.h>
#define none string::npos
using namespace std;
struct node {
string na;
int key;
string id;
};
vector < vector <node> > g(); int cnt;
vector < string > sv;
int mp [];
int n,m;
string trans(string str) {
int x=str.find("\"");
int y=str.rfind("\"");
str=str.substr(x+,y-x-); string ans;
for (int i=;i<str.size();i++) { //要考虑这样的情况不能直接替换 abc\\\\sx
if (str[i]=='\\') {
if (str[i+]=='\\') ans+='\\';
else ans+='\"';
i+=;
}
else ans+=str[i];
}
return ans;
}
vector <string> split (const string& str,const char flag=' ') {
vector <string> sv; string tmp;
istringstream iss(str);
while (getline(iss,tmp,flag))
sv.push_back(tmp);
return sv;
}
void match (string str) {
stack <int> st;
for (int i=;i<str.size();i++)
if (str[i]=='{') st.push(i);
else if (str[i]=='}') {
mp[st.top()]=i;
st.pop();
} // 找到大括号对应的位置
}
node ct_nt (int start,string str);
int ct_obj (int start,string str);
bool _find (int k,int x) {
if (x==) return ;
for (int i=;i<g[x].size();i++) {
if (g[x][i].na==sv[k]) {
if (k==sv.size()-) {
if (g[x][i].key==) cout<<"STRING "<<g[x][i].id<<endl;
else cout<<"OBJECT"<<endl;
return ;
}
else
return _find(k+,g[x][i].key);
}
}
return ;
}
int main ()
{
cin>>n>>m; getchar();
string str,s1;
for (int i=;i<n;i++) {
getline(cin,s1);
str+=s1;
}
match (str);
ct_obj(,str);
while (m--) {
getline(cin,str);
sv=split(str,'.');
if (!_find(,)) cout<<"NOTEXIST"<<endl;
}
return ;
}
node ct_nt (int start,string str) {
node ans;
int k=str.find(":");
string s1=str.substr(,k);
string s2=str.substr(k+);
ans.na=trans(s1);
int p=s2.find("{");
if (p==none) {// string 类
ans.key=;
ans.id=trans(s2);
}
else ans.key=ct_obj(start+k+,s2);
return ans;
}
int ct_obj (int start,string str) {
int num=++cnt;
int xpos=str.find("{");
int ypos=str.rfind("}");
str[ypos]=',';
int i=xpos+; int p;
while ( (p=str.find(",",i))!=none ) {
int k=str.find("{",i);
if (k!=none&&k<p) {
k=mp[start+k];
k=str.find(",",k-start);
}
else k=p;
if (str.substr(i,k-i)!="") {
node tmp=ct_nt(start+i,str.substr(i,k-i));
g[num].push_back(tmp);
}
i=k+;
}
return num;
}

CCF-20170903-JSON查询的更多相关文章

  1. CCF 201709-3 JSON查询

    CCF 201709-3 JSON查询 试题编号: 201709-3 试题名称: JSON查询 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 JSON (JavaScript ...

  2. 【CCF】JSON查询

    #include<iostream> #include<cstdio> #include<string> #include<cstring> #incl ...

  3. CCF CSP 201709-3 JSON查询

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201709-3 JSON查询 问题描述 JSON (JavaScript Object Not ...

  4. CCF(JSON查询:40分):字符串+模拟

    JSON查询 201709-3 纯字符串模拟,考的就是耐心和细心.可惜这两样我都缺... #include<iostream> #include<cstdio> #includ ...

  5. JS 实现Json查询的方法实例

    其实很简单,我这部分代码,前一部分是简单的实现如何使用JS写模板,第二个就是具体的实现了JSON查询的一个扩展. 以后查询Json就有了利器了. 代码如下: /*         * 定义模板函数   ...

  6. CCF-CSP题解 201709-3 JSON查询

    要求写一个小程序完成JSON查询的功能. 查询dfs就好了. 存储JSON对象用图(树)就好,把\(<key[],type,val[]>\)作为节点,然后又是字符串处理了. 其实就是个简化 ...

  7. CCF-CSP 201709-3 JSON查询 题解

    试题编号: 201709-3 试题名称: JSON查询 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 JSON (JavaScript Object Notation) 是一 ...

  8. ccf 201612-3 权限查询

     ccf 201612-3 权限查询 解题思路: 建立一个二维矩阵存储权限和角色 还差30分emmm #include<iostream> #include<cstring> ...

  9. MySQL全文索引、联合索引、like查询、json查询速度大比拼

    目录 查询背景 一.like查询 二.json函数查询 三.联合索引查询 四.全文索引查询 结论 查询背景 有一个表tmp_test_course大概有10万条记录,然后有个json字段叫outlin ...

  10. Unity3D 通过JSON查询天气

    一.天气查询API 获取天气信息,首先要找到提供天气数据的接口,我使用的是高德地图免费为我们提供的,网址为 https://lbs.amap.com/api/webservice/guide/api/ ...

随机推荐

  1. Swagger2使用参考

    GitHub例子: 参考博客: https://blog.csdn.net/sanyaoxu_2/article/details/80555328 http://www.cnblogs.com/Joi ...

  2. C# 线程 正确使用Thread.Join()停止方式

    /// <summary>        /// 停下线程        /// </summary>        private void MyStopTask()     ...

  3. Dubbo和Spring Cloud微服务架构对比

    https://blog.csdn.net/zhangweiwei2020/article/details/78646252

  4. C#以太坊基础入门

    在这一部分,我们将使用C#开发一个最简单的.Net控制台应用,来接入以太坊节点,并打印 所连接节点旳版本信息.通过这一部分的学习,你将掌握以下技能: 如何使用节点仿真器 如何在命令行访问以太坊节点 如 ...

  5. [Android] QPST,解BL锁,刷Recovery,备份系统,root,刷框架.

    QPST刷到qpst的1.9出厂版本,这个版本的BootLoader是锁定的: bootloader locked.其他版本不会重新锁定,只能relocked,不能恢复最初的locked,这样就不能升 ...

  6. JavaScript的DOM对象

    HTML DOM (文档对象模型) 当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model). HTML DOM 模型被构造为对象的树. HTML DOM 树 通过 ...

  7. icpc2018-焦作-F Honeycomb bfs

    http://codeforces.com/gym/102028/problem/F 就是一个bfs,主要问题是建图,要注意奇数和偶数列的联通方案是略有不同的.比赛的时候写完一直不过样例最后才发现没考 ...

  8. 数据结构与算法之PHP排序算法(堆排序)

    一.堆的定义 堆通常是一个可以被看做一棵树的数组对象,其任一非叶节点满足以下性质: 1)堆中某个节点的值总是不大于或不小于其父节点的值: 每个节点的值都大于或等于其左右子节点的值,称为大顶堆.即:ar ...

  9. python中的模块调用

    1.简介 在python中经常需要各模块相互调用,此时会出现以下几种情况: (1)同一目录下文件的调用 (2)父目录调用子目录中的文件 (3)同级目录下文件的调用 2.示例 现有该目录结构:AB中有A ...

  10. linux软件管理 YUM命令

    yum的优点 将所有软件包放到官方服务器上,当进行yum在线安装时可以自动解决依赖性问题 yum源文件 [root@ssgao1987 yum.repos.d]# cd /etc/yum.repos. ...