C. Bracket Sequences Concatenation Problem[括号匹配]

C. Bracket Sequences Concatenation Problem

题意:给定n个串,问有多少对s[i]+s[j]是正常的括号匹配?

思路:

1.本来就正常的,只能和正常匹配的一起

2.本来就不正常匹配的,只能和不正常匹配的在一起

那么对于每一个串,我们处理出它还需要cnt1个'('和cnt2个')'

如果cnt1,cn2>0,不管在左边还是右边加串,都不可行

如果cnt1==0&&cnt2==0已经是正常匹配

如果cnt1>0,cnt2==0,该串的右边需要cnt1个')'

如果cnt1==0,cnt2>0,该串的左边需要cnt2个')'

那么只要把需要cnt个左边的和cnt个右边的放在一起就一定可以匹配上了

复杂度O(n)

#include<bits/stdc++.h>
#define PI acos(-1.0)
#define pb push_back
#define F first
#define S second
#define debug puts
#define setp cout << fixed << setprecision(3)
#define FAST_IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
typedef long long ll;
const int N=3e5+5;
const int MOD=1e9+7;
const ll INF=1e18+8;
ll cntl[N],cntr[N];
int main(void){
    FAST_IO;
    int n;
    cin >> n;
    ll ans=0;
    for(int i=1;i<=n;i++){
        string s;
        cin >>s;
        int l=0,r=0;
        for(auto ch : s){
            if(ch=='(') l++;
            else{
                if(l>0) l--;
                else    r++;
            }
        }
        if(l==0&&r==0)  ans++;
        else if(l!=0&&r!=0) continue;
        else if(l==0&&r!=0) cntl[r]++;
        else if(l>0&&r==0)  cntr[l]++;
    }
    ans*=ans;
    for(int i=1;i<=3e5;i++){
        if(cntl[i]>0&&cntr[i]>0)    ans+=cntl[i]*cntr[i];
    }
    cout << ans << endl;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值