//http://i...content-available-to-author-only...e.com/AbO4tw
#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
#include <iterator>
#include <iomanip>
using namespace std;
vector<string> bracesExpressionExamples = {
"({[{}]{}[]})",
"({}}{[{}]{}[]})",
"({[{}]{}[]}",
"({[{}]{}]})",
"({[{}{}[]})",
"",
"{}"
};
string openBrace = "({[";
string closeBrace = ")}]";
typedef map<char, char> otc;
const otc& openToCloseBrace(){
static const otc o2c([](){
otc o2c;
transform(
openBrace.begin(), openBrace.end(),
closeBrace.begin(),
inserter(o2c, o2c.begin()),
[](const char open, const char close){return make_pair(open, close);}
);
return o2c;
}());
return o2c;
}
bool checkBraces (const string& e){
vector<char> s;
for(const char b: e)
if(string::npos!=openBrace.find(b))
s.push_back(openToCloseBrace().at(b));
else if(string::npos!=closeBrace.find(b) && (!s.empty()) && b==s.back())
s.pop_back();
else return false;
return s.empty();
}
int main() {
cout<<boolalpha;
transform(
bracesExpressionExamples.begin(),
bracesExpressionExamples.end(),
ostream_iterator<bool>(cout, "\n"),
checkBraces);
return 0;
}
Ly9odHRwOi8vaS4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4uZS5jb20vQWJPNHR3CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPG1hcD4KI2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGl0ZXJhdG9yPgojaW5jbHVkZSA8aW9tYW5pcD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnZlY3RvcjxzdHJpbmc+IGJyYWNlc0V4cHJlc3Npb25FeGFtcGxlcyA9IHsKCSIoe1t7fV17fVtdfSkiLAoJIih7fX17W3t9XXt9W119KSIsCgkiKHtbe31de31bXX0iLAoJIih7W3t9XXt9XX0pIiwKCSIoe1t7fXt9W119KSIsCgkiIiwKCSJ7fSIKfTsKCnN0cmluZyBvcGVuQnJhY2UgPSAiKHtbIjsKc3RyaW5nIGNsb3NlQnJhY2UgPSAiKX1dIjsKCnR5cGVkZWYgbWFwPGNoYXIsIGNoYXI+IG90YzsKY29uc3Qgb3RjJiBvcGVuVG9DbG9zZUJyYWNlKCl7CglzdGF0aWMgY29uc3Qgb3RjIG8yYyhbXSgpewoJCW90YyBvMmM7CgkJdHJhbnNmb3JtKAoJCQlvcGVuQnJhY2UuYmVnaW4oKSwgb3BlbkJyYWNlLmVuZCgpLAoJCQljbG9zZUJyYWNlLmJlZ2luKCksCgkJCWluc2VydGVyKG8yYywgbzJjLmJlZ2luKCkpLAoJCQlbXShjb25zdCBjaGFyIG9wZW4sIGNvbnN0IGNoYXIgY2xvc2Upe3JldHVybiBtYWtlX3BhaXIob3BlbiwgY2xvc2UpO30KCQkpOwoJCXJldHVybiBvMmM7Cgl9KCkpOwoJcmV0dXJuIG8yYzsgCn0KCmJvb2wgY2hlY2tCcmFjZXMgKGNvbnN0IHN0cmluZyYgZSl7Cgl2ZWN0b3I8Y2hhcj4gczsKCWZvcihjb25zdCBjaGFyIGI6IGUpCgkJaWYoc3RyaW5nOjpucG9zIT1vcGVuQnJhY2UuZmluZChiKSkKCQkJcy5wdXNoX2JhY2sob3BlblRvQ2xvc2VCcmFjZSgpLmF0KGIpKTsKCQllbHNlIGlmKHN0cmluZzo6bnBvcyE9Y2xvc2VCcmFjZS5maW5kKGIpICYmICghcy5lbXB0eSgpKSAmJiBiPT1zLmJhY2soKSkKCQkJcy5wb3BfYmFjaygpOwoJCWVsc2UgcmV0dXJuIGZhbHNlOwoJcmV0dXJuIHMuZW1wdHkoKTsKfQoKaW50IG1haW4oKSB7Cgljb3V0PDxib29sYWxwaGE7Cgl0cmFuc2Zvcm0oCgkJYnJhY2VzRXhwcmVzc2lvbkV4YW1wbGVzLmJlZ2luKCksCgkJYnJhY2VzRXhwcmVzc2lvbkV4YW1wbGVzLmVuZCgpLAoJCW9zdHJlYW1faXRlcmF0b3I8Ym9vbD4oY291dCwgIlxuIiksCgkJY2hlY2tCcmFjZXMpOwoJcmV0dXJuIDA7Cn0=