3
void getUnion(vector<string> &a, const vector<string> &b) {8
for (const auto &str_b : b) {10
for (const auto &str_a : a) {16
if (!found) a.push_back(str_b);19
void getComb(vector<string> &a, const vector<string> &b) {25
for (const auto &str_a : a) {26
for (const auto &str_b : b) {27
tmp.push_back(str_a + str_b);32
vector<string> braceExpansionII(string expression) {33
if (expression.size() == 0) return {};34
if (expression.size() == 1) return {expression};35
int n = expression.size();37
vector<string> processing_str;41
for (int i = 0; i < n; ++i) {42
if (expression[i] == '{') {43
if (in_brace) partial_str += expression[i];45
} else if (expression[i] == '}') {47
if (in_brace) partial_str += expression[i];49
getComb(processing_str, braceExpansionII(partial_str));52
} else if (in_brace == 0 && expression[i] == ',') {53
getUnion(ans, processing_str);54
processing_str.clear();56
} else if (in_brace == 0) {58
while (i < n && expression[i] >= 'a' && expression[i] <= 'z') tmp += expression[i++];60
getComb(processing_str, {tmp});62
partial_str += expression[i];65
getUnion(ans, processing_str);66
sort(ans.begin(), ans.end());