题目大意:
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版权协议,转载请附上原文出处链接和本声明。