CF1494A ABC String 题解
Content
给定 \(T\) 个仅包含大写字母 A,B,C 的字符串 \(s\)。问你是否能够通过将每个 A,B,C 换成 (,) 中的一个(同一个字母必须要换成同一个字符),使得最后得到的括号序列能够完全匹配。
数据范围:\(1\leqslant t\leqslant 10^3\),\(2\leqslant |s|\leqslant 50\)。
Solution
不愧是 bruteforces,开头第一题就来暴力。
我的想法是直接枚举每个字母换成左括号还是右括号。排除全是左括号和全是右括号的情况以后,得到的就只有 \(6\) 种情况:
| A | B | C | |
|---|---|---|---|
| 1 | ( | ( | ) |
| 2 | ( | ) | ( |
| 3 | ( | ) | ) |
| 4 | ) | ( | ( |
| 5 | ) | ( | ) |
| 6 | ) | ) | ( |
拿这六种情况一一代入原字符串里面中,只要有一种情况能够将原字符串变换之后的括号序列能够完全匹配就是 YES,如果六种情况全部都不能匹配就是 NO。
感觉没人比我更暴力了(
Code
std :: map<char, int> vis;
inline bool check(std :: string s) {
std :: stack<char> q; int lens = s.size();
F(i, 0, lens - 1) {
if(s[i] == '(') q.push(s[i]);
else {
if(q.empty()) return 0;
q.pop();
if(q.empty() && s[i + 1] == ')') return 0;
}
}
return q.empty();
}
int main() {
//freopen(".in", "r", stdin);
//freopen(".out", "w", stdout);
MT {
vis.clear();
crstr(s, len);
std :: string tmp = s;
F(i, 0, len - 1) {
if(s[i] == 'A' || s[i] == 'B') s[i] = '(';
else s[i] = ')';
}
if(check(s)) {puts("Yes"); continue;}
s = tmp;
F(i, 0, len - 1) {
if(s[i] == 'A' || s[i] == 'C') s[i] = '(';
else s[i] = ')';
}
if(check(s)) {puts("Yes"); continue;}
s = tmp;
F(i, 0, len - 1) {
if(s[i] == 'A') s[i] = '(';
else s[i] = ')';
}
if(check(s)) {puts("Yes"); continue;}
s = tmp;
F(i, 0, len - 1) {
if(s[i] == 'A') s[i] = ')';
else s[i] = '(';
}
if(check(s)) {puts("Yes"); continue;}
s = tmp;
F(i, 0, len - 1) {
if(s[i] == 'A' || s[i] == 'C') s[i] = ')';
else s[i] = '(';
}
if(check(s)) {puts("Yes"); continue;}
s = tmp;
F(i, 0, len - 1) {
if(s[i] == 'A' || s[i] == 'B') s[i] = ')';
else s[i] = '(';
}
if(check(s)) puts("Yes");
else puts("No");
}
return 0;
}

浙公网安备 33010602011771号