题解 CF917A 【The Monster】

举报
yd_254844956 发表于 2023/11/21 00:28:49 2023/11/21
【摘要】 枚举起点,用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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。