/* Zadatak: Lista Unjeti listu (logo) te na k upita ispisati trazeni clan Složenost: linearna Primjeri: Datum: Autor: Kristijan Burnik, udruga informatičara Božo Težak Gmail: kristijanburnik */ #include #include #include #include #include using namespace std; class NodeList { string _value; vector < NodeList > _items; bool _is_container; private: void create_from_string( string s ) { _is_container = false; stack stack; string buffer = ""; NodeList last_top; int len = s.size(); for (int i = 0; i < len; i++) { char c = s[i]; switch(c) { case '[': if (buffer.size() > 0) { stack.top().addItem(buffer); buffer = ""; } _is_container = true; stack.push(NodeList(true)); break; case ']': if (buffer.size() > 0) { stack.top().addItem(buffer); buffer = ""; } last_top = stack.top(); stack.pop(); if (stack.size() == 0) { break; } else { stack.top().addItem( last_top ); } break; case ' ': if (buffer.size() > 0) { stack.top().addItem( NodeList( buffer ) ); buffer=""; } break; default: buffer += c; } } if (!_is_container && buffer.size() > 0) { _value = buffer; } else { _items = last_top.getRawItems(); } }; public: NodeList( string s ) { create_from_string( s ); } NodeList( bool is_container = false ) { _is_container = is_container; }; // subscript operator NodeList& operator[] (const int nIndex) { return _items[ nIndex ]; } void addItem( NodeList g ) { _items.push_back( g ); } vector getRawItems() { return _items; } int size() { return _items.size(); } string str() { if (!_is_container) { return _value; } int n = size(); string s; s = "["; for (int i = 0; i < n; i++) { s += _items[i].str(); if (i < n-1) s += " "; } s += "]"; return s; } }; vector parse(string s) { vector poslist; string buffer=""; s+="."; for (int i = 0 ; i < s.size(); i++) { if (s[i] == '.') { int num; sscanf(buffer.c_str(),"%d",&num); poslist.push_back(num); buffer=""; } else { buffer += s[i]; } } return poslist; } int main() { string s; getline(cin,s); NodeList *n = new NodeList( s ); int k; cin >> k; for (int i = 0; i < k; i++) { string query; cin >> query; vector poslist = parse(query); NodeList *t = n; for (int i = 0 ; i < poslist.size(); i++) { int size = (*t).size(); int x = poslist[i] - 1; if (x < 0 || x > size-1) { t = NULL; break; } t = &(*t)[x]; } if (t == NULL) { cout << "?" << endl; } else { cout << t->str() << endl; } } return 0; }