不知道哪里出问题,一直得90。
建立一个树形结构的话,每次递归查询,建树过程要用到栈 ,{ 入栈, } 出栈,看似很简单一个题,就是拿不到100。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int MAXN = 2e5+5;
vector<int>v[MAXN];
string mp[MAXN],mp2[MAXN];
int vis[MAXN];
string s = "";
int n,m,tot = 1;
string que[MAXN];
int q_tot = 0;
string fun(int &i,int len)
{
string k = "";
for(int j=i;j<len;j++){
if(s[j] == '\"' && s[j-1]!='\\'){
i = j;
break;
}
else k += s[j];
}
return k;
}
string fun2(string k)
{
string ret = "";
int len = k.size();
for(int i=0;i<len;i++){
if(k[i] == '\\'){
ret += k[i+1];
i++;
}
else ret += k[i];
}
return ret;
}
int f = 0;
int no_id;
void dfs(int x,int fa,int step)
{
if(step == q_tot+1){
if(vis[x]){
f = 1;
no_id = x;
}
else {
f = 2;
}
return ;
}
int len = v[x].size();
for(int i=0;i<len;i++){
int to = v[x][i];
if(to == fa)continue;
if(mp[to] == que[step]){
dfs(to,x,step+1);
}
}
}
int main()
{
cin>>n>>m;
getchar();
s += "{";
for(int i=1;i<=n;i++){
string k;
getline(cin,k);
int len = k.size();
for(int j = 0;j<len;j++)
if(k[j]!=' ')s += k[j];
}
s += "}";
int len = s.size();
stack<int>ss;
ss.push(tot);
for(int i=0;i<len;i++){
if(s[i] == '\"' ){
i++;
string k = fun(i,len);
int fa = ss.top();
mp[++tot] = fun2(k);
// cout<<fa<<" = "<<tot<<endl;
// cout<<mp[tot]<<" **** "<<endl;
v[fa].push_back(tot);
}
if(s[i] == ':' && s[i+1] == '\"'){
i+=2;
string k = fun(i,len);
mp2[tot] = fun2(k);
vis[tot] = 1;
}
if(s[i] == ',')
continue;
if(s[i] == '{')
ss.push(tot);
if(s[i] == '}')
ss.pop();
}
while(m--)
{
q_tot = 0;
string s1,k = "";
getline(cin,s1);
int len = s1.size();
for(int i=0;i<=len;i++){
if(s1[i] == '.'||i == len){
que[++q_tot] = k;
k = "";
}
else {
k += s1[i];
}
}
f = 0;
dfs(1,1,1);
if(f == 0){
cout<<"NOTEXIST"<<endl;
}
if(f == 1){
cout<<"STRING "<<mp2[no_id]<<endl;
}
if(f == 2){
cout<<"OBJECT"<<endl;
}
}
}
/*
10 7
{
"firstName": "John",
"lastName": "Smith",
"address": { "a":"axa",
"streetAddress": {"a":"2ndStreet","b":{"c":"d"},{}},
"city": "NewYork",
"state": "NY"
},
"esc\\aped": "\"hello\""
}
firstName
address
address.city
address.postal
esc\aped
address.streetAddress.b.c
*/