#include <vector>
#include <string>
#include <iostream>
static const std::vector<std::string> EXAMPLES = {
"({[{}]{}[]})",
"({}}{[{}]{}[]})",
"({[{}]{}[]}",
"({[{}]{}]})",
"({[{}{}[]})",
"",
"{}",
"(i (am so [lispish]))",
};
static const char eof = char(-1);
static const std::string open_braces = "({[";
static const std::string close_braces = ")}]";
inline char matching_brace(char c)
{
const std::size_t i = close_braces.find(c);
return i != std::string::npos ? open_braces[i] : eof;
}
static bool is_balanced(const std::string &s)
{
std::string brace_stack;
for (auto c : s) {
if (open_braces.find(c) != std::string::npos) {
brace_stack.push_back(c);
continue;
}
const char pair = matching_brace(c);
if (pair != eof) {
if (!brace_stack.empty() && brace_stack.back() == pair) {
brace_stack.pop_back();
} else {
return false;
}
}
}
return brace_stack.empty();
}
int main()
{
std::cout << std::boolalpha;
for (const auto & e : EXAMPLES) {
std::cout << is_balanced(e) << "\n";
}
return 0;
}
I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBFWEFNUExFUyA9IHsKICAgIAkiKHtbe31de31bXX0pIiwKICAgICAgICAiKHt9fXtbe31de31bXX0pIiwKICAgICAgICAiKHtbe31de31bXX0iLAogICAgICAgICIoe1t7fV17fV19KSIsCiAgICAgICAgIih7W3t9e31bXX0pIiwKICAgICAgICAiIiwKICAgICAgICAie30iLAogICAgICAgICIoaSAoYW0gc28gW2xpc3Bpc2hdKSkiLAp9OwoKc3RhdGljIGNvbnN0IGNoYXIgZW9mID0gY2hhcigtMSk7CnN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBvcGVuX2JyYWNlcyAgPSAiKHtbIjsKc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGNsb3NlX2JyYWNlcyA9ICIpfV0iOwoKaW5saW5lIGNoYXIgbWF0Y2hpbmdfYnJhY2UoY2hhciBjKQp7CiAgICBjb25zdCBzdGQ6OnNpemVfdCBpID0gY2xvc2VfYnJhY2VzLmZpbmQoYyk7CiAgICByZXR1cm4gaSAhPSBzdGQ6OnN0cmluZzo6bnBvcyA/IG9wZW5fYnJhY2VzW2ldIDogZW9mOwp9CgpzdGF0aWMgYm9vbCBpc19iYWxhbmNlZChjb25zdCBzdGQ6OnN0cmluZyAmcykKewogICAgc3RkOjpzdHJpbmcgYnJhY2Vfc3RhY2s7CgogICAgZm9yIChhdXRvIGMgOiBzKSB7CiAgICAgICAgaWYgKG9wZW5fYnJhY2VzLmZpbmQoYykgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKICAgICAgICAgICAgYnJhY2Vfc3RhY2sucHVzaF9iYWNrKGMpOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgICAgIGNvbnN0IGNoYXIgcGFpciA9IG1hdGNoaW5nX2JyYWNlKGMpOwogICAgICAgIGlmIChwYWlyICE9IGVvZikgewogICAgICAgICAgICBpZiAoIWJyYWNlX3N0YWNrLmVtcHR5KCkgJiYgYnJhY2Vfc3RhY2suYmFjaygpID09IHBhaXIpIHsKICAgICAgICAgICAgICAgIGJyYWNlX3N0YWNrLnBvcF9iYWNrKCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIGJyYWNlX3N0YWNrLmVtcHR5KCk7Cn0KCmludCBtYWluKCkKewogICAgc3RkOjpjb3V0IDw8IHN0ZDo6Ym9vbGFscGhhOwogICAgZm9yIChjb25zdCBhdXRvICYgZSA6IEVYQU1QTEVTKSB7CiAgICAgICAgc3RkOjpjb3V0IDw8IGlzX2JhbGFuY2VkKGUpIDw8ICJcbiI7CiAgICB9CiAgICByZXR1cm4gMDsKfQ==