#include <iostream>
#include <set>
#include <string>
void remove_redundant_opening_brackets(const std::string& s, size_t end, std::set<std::string>& output)
{
int level = 0;
for (size_t i = end; i--;)
{
if (s[i] == ')')
{
++level;
}
else if (s[i] == '(' && --level < 0)
{
char last = 0;
for (size_t j = i; j < s.length(); ++j)
{
if (s[j] == '(' && last != '(')
{
remove_redundant_opening_brackets(std::string(s).erase(j, 1), i, output);
}
last = s[j];
}
return;
}
}
output.insert(s);
}
void remove_redundant_brackets(const std::string& s, size_t begin, std::set<std::string>& output)
{
int level = 0;
for (size_t i = begin; i < s.length(); ++i)
{
if (s[i] == '(')
{
++level;
}
else if (s[i] == ')' && --level < 0)
{
char last = 0;
for (size_t j = 0; j <= i; ++j)
{
if (s[j] == ')' && last != ')')
{
remove_redundant_brackets(std::string(s).erase(j, 1), i, output);
}
last = s[j];
}
return;
}
}
remove_redundant_opening_brackets(s, s.length(), output);
}
std::set<std::string> remove_redundant_brackets(const std::string& s)
{
std::set<std::string> output;
remove_redundant_brackets(s, 0, output);
return output;
}
int main()
{
const auto s = "(a)())()))((b(b)";
for (auto&& s : remove_redundant_brackets(s))
{
std::cout << s << std::endl;
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c2V0PgojaW5jbHVkZSA8c3RyaW5nPgoKdm9pZCByZW1vdmVfcmVkdW5kYW50X29wZW5pbmdfYnJhY2tldHMoY29uc3Qgc3RkOjpzdHJpbmcmIHMsIHNpemVfdCBlbmQsIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiYgb3V0cHV0KQp7CiAgIGludCBsZXZlbCA9IDA7CiAgIGZvciAoc2l6ZV90IGkgPSBlbmQ7IGktLTspCiAgIHsKICAgICAgaWYgKHNbaV0gPT0gJyknKQogICAgICB7CiAgICAgICAgICsrbGV2ZWw7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoc1tpXSA9PSAnKCcgJiYgLS1sZXZlbCA8IDApCiAgICAgIHsKICAgICAgICAgY2hhciBsYXN0ID0gMDsKICAgICAgICAgZm9yIChzaXplX3QgaiA9IGk7IGogPCBzLmxlbmd0aCgpOyArK2opCiAgICAgICAgIHsKICAgICAgICAgICAgaWYgKHNbal0gPT0gJygnICYmIGxhc3QgIT0gJygnKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIHJlbW92ZV9yZWR1bmRhbnRfb3BlbmluZ19icmFja2V0cyhzdGQ6OnN0cmluZyhzKS5lcmFzZShqLCAxKSwgaSwgb3V0cHV0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBsYXN0ID0gc1tqXTsKICAgICAgICAgfQogICAgICAgICByZXR1cm47CiAgICAgIH0KICAgfQogICBvdXRwdXQuaW5zZXJ0KHMpOwp9Cgp2b2lkIHJlbW92ZV9yZWR1bmRhbnRfYnJhY2tldHMoY29uc3Qgc3RkOjpzdHJpbmcmIHMsIHNpemVfdCBiZWdpbiwgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+JiBvdXRwdXQpCnsKICAgaW50IGxldmVsID0gMDsKICAgZm9yIChzaXplX3QgaSA9IGJlZ2luOyBpIDwgcy5sZW5ndGgoKTsgKytpKQogICB7CiAgICAgIGlmIChzW2ldID09ICcoJykKICAgICAgewogICAgICAgICArK2xldmVsOwogICAgICB9CiAgICAgIGVsc2UgaWYgKHNbaV0gPT0gJyknICYmIC0tbGV2ZWwgPCAwKQogICAgICB7CiAgICAgICAgIGNoYXIgbGFzdCA9IDA7CiAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDw9IGk7ICsraikKICAgICAgICAgewogICAgICAgICAgICBpZiAoc1tqXSA9PSAnKScgJiYgbGFzdCAhPSAnKScpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgcmVtb3ZlX3JlZHVuZGFudF9icmFja2V0cyhzdGQ6OnN0cmluZyhzKS5lcmFzZShqLCAxKSwgaSwgb3V0cHV0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBsYXN0ID0gc1tqXTsKICAgICAgICAgfQogICAgICAgICByZXR1cm47CiAgICAgIH0KICAgfQogICByZW1vdmVfcmVkdW5kYW50X29wZW5pbmdfYnJhY2tldHMocywgcy5sZW5ndGgoKSwgb3V0cHV0KTsKfQoKc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IHJlbW92ZV9yZWR1bmRhbnRfYnJhY2tldHMoY29uc3Qgc3RkOjpzdHJpbmcmIHMpCnsKICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IG91dHB1dDsKICAgcmVtb3ZlX3JlZHVuZGFudF9icmFja2V0cyhzLCAwLCBvdXRwdXQpOwogICByZXR1cm4gb3V0cHV0Owp9CgppbnQgbWFpbigpCnsKICAgY29uc3QgYXV0byBzID0gIihhKSgpKSgpKSkoKGIoYikiOwoKICAgZm9yIChhdXRvJiYgcyA6IHJlbW92ZV9yZWR1bmRhbnRfYnJhY2tldHMocykpCiAgIHsKICAgICAgc3RkOjpjb3V0IDw8IHMgPDwgc3RkOjplbmRsOwogICB9Cn0KCg==