#include <vector>
#include <string>
#include <iostream>
#include <iomanip>
using namespace std;
string getElement(const char* &c)
{
string t;
while(*c &&(*c == ' ' || *c == ',' || *c == '}')) ++c;
if (*c == 0) return "";
if (*c == '{')
{
int cnt = 0;
do {
t += *c;
if (*c == '{') cnt++;
if (*c == '}') cnt--;
c++;
} while(cnt);
}
else
{
while(*c != ',' && *c != '}' )
{
if (*c != ' ') t += *c;
c++;
}
}
return t;
}
vector<string> parse(const string& s)
{
vector<string> v;
const char * c = s.data();
for(;*c && *c != '{'; ++c);
if (*c++ == 0) return v;
string t;
while((t = getElement(c)).size())
v.push_back(t);
return v;
}
int main(int argc, char * argv[])
{
for(auto s: parse("{ a, b, c }" )) cout << "[" << s << "]"; cout << endl;
for(auto s: parse("{ {a}, {b}, {c} }")) cout << "[" << s << "]"; cout << endl;
for(auto s: parse("{ {a, b} , c }" )) cout << "[" << s << "]"; cout << endl;
for(auto s: parse("{ {a, {b}} , c }" )) cout << "[" << s << "]"; cout << endl;
}
I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aW9tYW5pcD4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpzdHJpbmcgZ2V0RWxlbWVudChjb25zdCBjaGFyKiAmYykKewogICAgc3RyaW5nIHQ7CiAgICB3aGlsZSgqYyAmJigqYyA9PSAnICcgfHwgKmMgPT0gJywnIHx8ICpjID09ICd9JykpICsrYzsKICAgIGlmICgqYyA9PSAwKSByZXR1cm4gIiI7CiAgICBpZiAoKmMgPT0gJ3snKQogICAgewogICAgICAgIGludCBjbnQgPSAwOwogICAgICAgIGRvIHsKICAgICAgICAgICAgdCArPSAqYzsKICAgICAgICAgICAgaWYgKCpjID09ICd7JykgY250Kys7CiAgICAgICAgICAgIGlmICgqYyA9PSAnfScpIGNudC0tOwogICAgICAgICAgICBjKys7CiAgICAgICAgfSB3aGlsZShjbnQpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHdoaWxlKCpjICE9ICcsJyAmJiAqYyAhPSAnfScgKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCpjICE9ICcgJykgdCArPSAqYzsKICAgICAgICAgICAgYysrOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiB0Owp9Cgp2ZWN0b3I8c3RyaW5nPiBwYXJzZShjb25zdCBzdHJpbmcmIHMpCnsKICAgIHZlY3RvcjxzdHJpbmc+IHY7CiAgICBjb25zdCBjaGFyICogYyA9IHMuZGF0YSgpOwogICAgZm9yKDsqYyAmJiAqYyAhPSAneyc7ICsrYyk7CiAgICBpZiAoKmMrKyA9PSAwKSByZXR1cm4gdjsKICAgIHN0cmluZyB0OwoKICAgIHdoaWxlKCh0ID0gZ2V0RWxlbWVudChjKSkuc2l6ZSgpKQogICAgICAgIHYucHVzaF9iYWNrKHQpOwogICAgcmV0dXJuIHY7Cn0KCmludCBtYWluKGludCBhcmdjLCBjaGFyICogYXJndltdKQp7CiAgICBmb3IoYXV0byBzOiBwYXJzZSgieyBhLCBiLCBjIH0iICAgICAgKSkgY291dCA8PCAiWyIgPDwgcyA8PCAiXSI7IGNvdXQgPDwgZW5kbDsKICAgIGZvcihhdXRvIHM6IHBhcnNlKCJ7IHthfSwge2J9LCB7Y30gfSIpKSBjb3V0IDw8ICJbIiA8PCBzIDw8ICJdIjsgY291dCA8PCBlbmRsOwogICAgZm9yKGF1dG8gczogcGFyc2UoInsge2EsIGJ9ICwgYyB9IiAgICkpIGNvdXQgPDwgIlsiIDw8IHMgPDwgIl0iOyBjb3V0IDw8IGVuZGw7CiAgICBmb3IoYXV0byBzOiBwYXJzZSgieyB7YSwge2J9fSAsIGMgfSIgKSkgY291dCA8PCAiWyIgPDwgcyA8PCAiXSI7IGNvdXQgPDwgZW5kbDsKfQo=