CF1494A ABC String 题解

Content

给定 \(T\) 个仅包含大写字母 ABC 的字符串 \(s\)。问你是否能够通过将每个 ABC 换成 () 中的一个(同一个字母必须要换成同一个字符),使得最后得到的括号序列能够完全匹配。

数据范围:\(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;
}
posted @ 2021-12-16 11:44  Eason_AC  阅读(66)  评论(0)    收藏  举报