题解 CF917A 【The Monster】
【摘要】 枚举起点,用tot记录,'(' 为+1,')' 为-1,若 tot == 0,说明找到一组解,则Ans++若是'?'判断tot是否大于0,表示需要右括号匹配,若大于0,此时使'?'为右括号,由于右括号一定可以改为左括号,因此num++(num为可以修改为右括号的'?'个数)而若小于此时tot < 0,说明'?'只能为左括号,因此不计入num如果某一个时刻,tot<0且num>0,说明可以将之...
枚举起点,用tot记录,'(' 为+1,')' 为-1,若 tot == 0,说明找到一组解,则Ans++
若是'?'判断tot是否大于0,表示需要右括号匹配,若大于0,此时使'?'为右括号,由于右括号一定可以改为左括号,因此num++(num为可以修改为右括号的'?'个数)
而若小于此时tot < 0,说明'?'只能为左括号,因此不计入num
如果某一个时刻,tot<0且num>0,说明可以将之前的右括号改为左括号,则tot += 2,并num--
若tot<0 但num为0,说明此序列当前及以后都不会合法,break即可
int main()
{
cin >> s;
int len = strlen(s);
for(int i = 0; i < len; ++i)
{
tot = 0; num = 0;
for(int j = i; j < len; ++j)
{
if(s[j] == '(') tot++;
if(s[j] == ')') tot--;
if(s[j] == '?')
{
if(tot > 0)
tot--,num++;
else
tot++;
}
if(tot < 0 && num) tot += 2,num--;
if(tot < 0 && !num) break;
if(tot == 0) Ans++;
}
}
cout << Ans;
return 0;
}
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)