Educational Codeforces Round 45 (Rated for Div. 2) C. Bracket Sequences Concatenation Problem


  1. C,与括号序列的相关问题
    一个括号序列是一个包括“(”和“)”的字符串。
    一个合格的括号序列是一个通过在原始的字符序列中插入“1”,和“+”可以
    转换成一个成一个正确的算法表达式的一个括号序列。比如,括号序列“()()”
    ,“(())”是合格的(结果可以表达为:“(1)+(1)”,”((1+1)+1).且“)(”和
    “(”不是合格的。
    给你n个括号序列s1,s2,……sn.计算i,j的对数且需满足对(i,j)和(j,i)必须
    被计入答案中。因此,si+si是一个合格的括号序列。对(i,i)必须计入答案中。
    输入:
    第一行包括一个整数n(1<=n<=3e5)——括号序列的个数。下面的n行是n个括号
    序列。——非空的包括“(”,“)”的字符串。所有的括号序列的长度不会超过3e5
    输出:
    单独的一行一个整数——满足条件的对i,j(1<=I,j<=n)且满足括号学列si+sj是一个
    合格的序列
    提示:
    在第一个样例中,满足条件的对为(3,1)和(2,2)
    在第二个样例中,任何一个对都是满足条件的(1,1),(1,2),(2,1),(2,2)
  2. 题目连接:http://codeforces.com/contest/990/problem/C

  3. 通过的代码:

#include<iostream>
#include<string>
using namespace std;
const int N=4e5+6;
int n,a[N],b[N],vis[N];
long long ans;
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        int l,r;l=r=0;
        string str;cin>>str;
        for(int j=0;str[j];++j)if(str[j]=='(')++l;else l?--l:++r;
        if(l&&r)continue;
        l?vis[i]=1,a[i]=l:++b[r];
        if(!l&&!r)vis[i]=1,a[i]=0;
    }
    for(int i=1;i<=n;i++)ans+=vis[i]*b[a[i]];
    cout<<ans<<endl;
}

猜你喜欢

转载自blog.csdn.net/light2chasers/article/details/80650515