zoukankan      html  css  js  c++  java
  • 2014牡丹江现场-H-大模拟

    大模拟

      1 #include <cstdio>
      2 #include <cstring>
      3 #include <algorithm>
      4 #include <string>
      5 #include <vector>
      6 #include <map>
      7 
      8 using namespace std;
      9 
     10 const int maxn = 1e7+10;
     11 const int max_node = 1e5+10;
     12 
     13 int T,N,len;
     14 char line[maxn];
     15 char text[maxn];
     16 
     17 struct node
     18 {
     19     string contain;
     20     int kind;
     21     int sons;
     22     map<string,int> key;
     23     map<string,int> nxt;
     24     vector <pair<int,int> > val;
     25 }json[max_node];
     26 
     27 int n_eon = 0;
     28 
     29 pair<int,int> dfs(int pos,int fa)
     30 {
     31     json[++n_eon].kind = 0;
     32     json[n_eon].key.clear();
     33     json[n_eon].val.clear();
     34     json[n_eon].nxt.clear();
     35 
     36     int cur_eon = n_eon;
     37 
     38     //printf("%s
    ",text+pos);
     39     bool flag_key = false;
     40 
     41     string val;
     42     string key;
     43 
     44     while(pos < len)
     45     {
     46         if(text[pos] == '{' && flag_key)
     47         {
     48             pair<int,int> tmp = dfs(pos+1,n_eon);
     49             int n_pos = tmp.first;
     50             pair<int,int> pr;
     51             pr.first = pos;
     52             pr.second = n_pos;
     53             //val.clear();
     54             //for(int i=pos;i<n_pos;i++)
     55             //{
     56             //    val += text[i];
     57             //}
     58 
     59             pos = n_pos;
     60             flag_key = false;
     61             //printf("02:get val %s
    ",val.c_str());
     62             json[cur_eon].val.push_back(pr);
     63             json[cur_eon].nxt.insert(pair<string,int>(key,tmp.second));
     64         }
     65         else if(text[pos] == '}')
     66         {
     67             return pair<int,int>(pos+1,cur_eon);
     68         }
     69         else if(text[pos] == '"')
     70         {
     71             if(flag_key == false)
     72             {
     73                 key.clear();
     74                 while(++pos < len && text[pos] != '"')
     75                 {
     76                     key += text[pos];
     77                 }
     78                 pos++;
     79                 //printf("get key %s cur:%d 
    ",key.c_str(),cur_eon);
     80                 json[cur_eon].key.insert(pair<string,int>(key,json[cur_eon].val.size()));
     81                 flag_key = true;
     82             }
     83             else
     84             {
     85                 pair<int,int> pr;
     86                 pr.first = pos;
     87                 //val.clear();
     88                 //val+='"';
     89 
     90                 while(++pos < len && text[pos] != '"')
     91                 {
     92                     //val += text[pos];
     93                 }
     94 
     95                 //val+='"';
     96                 pr.second = ++pos;
     97                 //pos++;
     98                 //printf("01:get val %s cur:%d siz:%d
    ",val.c_str(),cur_eon,json[cur_eon].val.size());
     99                 json[cur_eon].val.push_back(pr);
    100                 flag_key = false;
    101             }
    102         }
    103         else if(text[pos] == ':')
    104         {
    105             if(flag_key)
    106             {
    107 
    108             }
    109             else
    110             {
    111                 //printf("Error! no key
    ");
    112             }
    113             pos++;
    114         }
    115         else if(text[pos] == ',')
    116         {
    117             pos++;
    118         }
    119         //pos++;
    120     }
    121 }
    122 
    123 char op[maxn];
    124 int main()
    125 {
    126     //freopen("input.txt","r",stdin);
    127     //freopen("output.txt","w",stdout);
    128     scanf("%d ",&T);
    129     while(T--)
    130     {
    131         n_eon = 0;
    132         gets(line);
    133         len = strlen(line);
    134         int cnt = 0;
    135         for(int i=0;i<len;i++)
    136         {
    137             if(line[i] == ' ') continue;
    138             else text[cnt++] = line[i];
    139         }
    140         text[cnt] = 0;
    141 
    142         len = cnt;
    143         dfs(1,0);
    144         //printf("load!
    ");
    145         scanf("%d ",&N);
    146         for(int i=0;i<N;i++)
    147         {
    148             //printf("N:%d i:%d
    ",N,i);
    149             gets(op);
    150             int l = strlen(op),pos = 0;
    151             int cur = 1;
    152             //printf("q:%s
    ",op);
    153             while(pos < l)
    154             {
    155                 if(op[pos] == '"')
    156                 {
    157                     string key;
    158                     while(++pos < l && op[pos] != '"')
    159                     {
    160                         key += op[pos];
    161                     }
    162                     //printf("query: %s
    ",key.c_str());
    163                     pos++;
    164                     if(json[cur].key.count(key) != 0)
    165                     {
    166                         if(op[pos] == '.' && json[cur].nxt.count(key) != 0)
    167                         {
    168                             cur = json[cur].nxt[key];
    169                             pos++;
    170                             continue;
    171                         }
    172                         if(op[pos] == 0)
    173                         {
    174                             //printf("cur:%d get: %d num:%d
    ",cur,json[cur].key[key],json[cur].val.size());
    175                             //printf("%s
    ",json[cur].val[ json[cur].key[key] ].c_str());
    176                             pair<int,int> tp = json[cur].val[ json[cur].key[key] ];
    177                             for(int i=tp.first; i < tp.second ; i++)
    178                             {
    179                                 putchar(text[i]);
    180                             }
    181                             puts("");
    182                             break;
    183                         }
    184                         else
    185                         {
    186                             printf("Error!
    ");
    187                             break;
    188                         }
    189                     }
    190                     else
    191                     {
    192                         printf("Error!
    ");
    193                         break;
    194                     }
    195                 }
    196             }
    197         }
    198     }
    199 }
  • 相关阅读:
    [jdk] JDK1.5新特性
    [maven] maven介绍
    [Ant] bulid.xml配置详解
    [spring] spring面试题
    .net(C#)时间相减、C#计算时间间隔
    如何记录应用程序日志
    交换机、集线器、路由器区别和使用浅谈
    ASP.NET 在域控制器上使用默认 ASPNET 帐户不能正常运行
    .NET 4中Entity Framework简介
    WCF传输性能测试
  • 原文地址:https://www.cnblogs.com/helica/p/5768330.html
Copyright © 2011-2022 走看看