Bracket Sequences Concatenation Problem CodeForces - 990C(括号匹配水题)

明确一下  一个字符串有x左括号不匹配  和 另一个字符串有x个右括号不匹配  这俩是一定能够匹配的

脑子有点迷 emm。。。

所以统计就好了  统计x个左括号的有几个,x个右括号的有几个 然后 乘一下

如果一个串 同时存在左右括号都不匹配的情况 则忽略 因为这个串需要另外两个括号去匹配

不要忘了处理左右括号已经匹配的情况

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6+5, INF = 0x7fffffff;
typedef long long LL;
LL a[maxn], b[maxn];
string str;
int main()
{
    int n;
    cin>> n;
    int lef, rig, maxx = -INF;
    for(int i=0; i<n; i++)
    {
        cin>> str;
        int len = str.size();
        maxx = max(len, maxx);
        lef = INF;
        rig = 0;
        for(int j=0; j<len; j++)
        {
            if(str[j] == '(')
                rig++;
            else
                rig--;
            lef = min(lef, rig);
        }
        if(lef < 0 && rig > lef)    //说明两边同时存在不匹配的左右括号
            continue;
        if(lef < 0)                 //有多的不匹配的左括号
            b[abs(lef)]++;
        else                        //有多的不匹配的右括号
            a[rig]++;
    }
    LL res = 0;
    for(int i=1; i<=maxx; i++)
        res += a[i] * b[i];
    res += a[0] * a[0];
    cout<< res <<endl;


    return 0;
}

 

posted @ 2018-08-27 16:08  WTSRUVF  阅读(252)  评论(0编辑  收藏  举报