Educational Codeforces Round 132(div.2) C. Recover an RBS

题目链接:Problem - C - Codeforces

题目大意:

 t (1≤t≤5⋅1e4) 次询问,每次给一个包含'?' ;  '('  ;  ')'的字串,判断将?改为括号,使得括号序列合法,并且要求方法唯一。

所有长度和不超过 2⋅1e5

思路:

做法来源于cf论坛大佬。

在线处理,左括号记为1,右括号记为-1,cnt1表示当前匹配情况,cnt2表示当前?的个数。

如果前面左右括号匹配了,只有一个?,则它一定是左括号。

如果有多余的右括号,当前(数目比?数目少1,可用?抵消。

最后判断cnt1的绝对值和cnt2的值是否相等。

代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int t;
	cin>>t;
	while(t--){
		string s;
		int cnt1=0,cnt2=0;
		cin>>s;
		for(int i=0;i<s.size();++i){
			if(s[i]=='(') ++cnt1;
			if(s[i]==')') --cnt1;
			if(s[i]=='?') ++cnt2;
			if(cnt1+cnt2==1) cnt1=1,cnt2=0;
		}
		if(abs(cnt1)==cnt2) puts("YES");
		else puts("NO");
	}
	return 0;
}


版权声明:本文为qq_60256199原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。