#include <iomanip>
#include <iostream>
#include <numeric>
#include <string>
using namespace std;
bool foo(const string& context, const size_t pos) {
const auto it = next(cbegin(context), pos);
const auto before = accumulate(cbegin(context), it, 0, [](const auto output, const auto input) {
if(input == '{') {
return output + 1;
}
else if(input == '}' && output > 0) {
return output - 1;
}
else {
return output;
}
});
const auto after = accumulate(it, cend(context), 0, [](const auto output, const auto input) {
if(input == '{') {
return output + 1;
}
else if(input == '}') {
return output - 1;
}
else {
return output;
}
});
return before + after >= 0;
}
int main() {
cout << boolalpha;
for(const auto& test : { ""s, "{"s, "}"s, "{}"s, "{{}}"s, "}{}"s, "{{}"s, "{}}"s, "{}{"s }) {
cout << test << endl;
for(size_t i = 0; i <= test.size(); ++i) {
cout << '\t' << i << ": " << foo(test, i) << endl;
}
}
}
I2luY2x1ZGUgPGlvbWFuaXA+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPG51bWVyaWM+CiNpbmNsdWRlIDxzdHJpbmc+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKYm9vbCBmb28oY29uc3Qgc3RyaW5nJiBjb250ZXh0LCBjb25zdCBzaXplX3QgcG9zKSB7CiAgY29uc3QgYXV0byBpdCA9IG5leHQoY2JlZ2luKGNvbnRleHQpLCBwb3MpOwogIGNvbnN0IGF1dG8gYmVmb3JlID0gYWNjdW11bGF0ZShjYmVnaW4oY29udGV4dCksIGl0LCAwLCBbXShjb25zdCBhdXRvIG91dHB1dCwgY29uc3QgYXV0byBpbnB1dCkgewogICAgaWYoaW5wdXQgPT0gJ3snKSB7CiAgICAgIHJldHVybiBvdXRwdXQgKyAxOwogICAgfQogICAgZWxzZSBpZihpbnB1dCA9PSAnfScgJiYgb3V0cHV0ID4gMCkgewogICAgICByZXR1cm4gb3V0cHV0IC0gMTsKICAgIH0KICAgIGVsc2UgewogICAgICByZXR1cm4gb3V0cHV0OwogICAgfQogIH0pOwogIGNvbnN0IGF1dG8gYWZ0ZXIgPSBhY2N1bXVsYXRlKGl0LCBjZW5kKGNvbnRleHQpLCAwLCBbXShjb25zdCBhdXRvIG91dHB1dCwgY29uc3QgYXV0byBpbnB1dCkgewogICAgaWYoaW5wdXQgPT0gJ3snKSB7CiAgICAgIHJldHVybiBvdXRwdXQgKyAxOwogICAgfQogICAgZWxzZSBpZihpbnB1dCA9PSAnfScpIHsKICAgICAgcmV0dXJuIG91dHB1dCAtIDE7CiAgICB9CiAgICBlbHNlIHsKICAgICAgcmV0dXJuIG91dHB1dDsKICAgIH0KICB9KTsKCiAgcmV0dXJuIGJlZm9yZSArIGFmdGVyID49IDA7Cn0KCmludCBtYWluKCkgewogIGNvdXQgPDwgYm9vbGFscGhhOwoKICBmb3IoY29uc3QgYXV0byYgdGVzdCA6IHsgIiJzLCAieyJzLCAifSJzLCAie30icywgInt7fX0icywgIn17fSJzLCAie3t9InMsICJ7fX0icywgInt9eyJzIH0pIHsKICAgIGNvdXQgPDwgdGVzdCA8PCBlbmRsOwoKICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPD0gdGVzdC5zaXplKCk7ICsraSkgewogICAgICBjb3V0IDw8ICdcdCcgPDwgaSA8PCAiOiAiIDw8IGZvbyh0ZXN0LCBpKSA8PCBlbmRsOwogICAgfQogIH0KfQ==