Codeforces Round #529 (Div. 3) E. Almost Regular Bracket Sequence (思维)

Posted zhgyki

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #529 (Div. 3) E. Almost Regular Bracket Sequence (思维)相关的知识,希望对你有一定的参考价值。

Codeforces Round #529 (Div. 3)

题目传送门

题意:

给你由左右括号组成的字符串,问你有多少处括号翻转过来是合法的序列

 

思路:

这么考虑:

如果是左括号

1)整个序列左括号个数比右括号多 2

2)在这个位置之前,所有位置的前缀左括号个数都不少于前缀右括号个数

3)在这个位置和这个位置之后,在修改后所有位置的前缀左括号个数减去前缀右括号个数大于2

(这里这么想,把左变成右,左-1,右+1)

右括号也是这样

代码:

技术分享图片
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int a[N],pre[N],post[N];
char s[N];
int n;
int main()
{
    while(~scanf("%d",&n))
    {
        scanf("%s",s+1);
        int x=0;
        memset(a,0,sizeof(a));
        for(int i=1;i<=n;i++)
        {
            if(s[i]==() x++;
            else x--;
            a[i]=x;
        }
       pre[0]=N,post[n]=N;
       for(int i=1;i<n;i++) pre[i]=min(pre[i-1],a[i]);
       for(int i=n-1;i>=0;i--) post[i]=min(post[i+1],a[i]);
       int ans=0;
       if(x!=-2&&x!=2)
       {
           printf("0
");
       }
       else{
       for(int i=1;i<=n;i++)
       {
           if(s[i]==()
           {
               if(pre[i-1]>=0&&post[i]>=2&&x==2) ans++;
           }
           else if(pre[i-1]>=0&&post[i]>=-2&&x==-2) ans++;
       }
        printf("%d
",ans);
       }
    }
}
View Code

 

以上是关于Codeforces Round #529 (Div. 3) E. Almost Regular Bracket Sequence (思维)的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #529 (Div. 3) E. Almost Regular Bracket Sequence (思维)

D. Circular Dance codeforces round#529(div3)

Codeforces Round #436 E. Fire(背包dp+输出路径)

[ACM]Codeforces Round #534 (Div. 2)

Codeforces Round #726 (Div. 2) B. Bad Boy(贪心)

Codeforces Global Round 19