当前位置: 代码迷 >> 综合 >> 【杂题】Codeforce990C Bracket Sequences Concatenation Problem
  详细解决方案

【杂题】Codeforce990C Bracket Sequences Concatenation Problem

热度:69   发布时间:2023-09-27 07:33:01.0

题意:

给出N个字符串,每个串均由括号组成。
现在求从中选出两个串,使得其能成为一个合法的括号匹配的方案数。


分析:

左括号视为1,右括号视为-1,求出每个字符串的权值和,权值和为其相反数的串,就能和它组成一个括号匹配。注意,如果一个串中间某部分的值与最后的和异号,则这个串是非法的。

#include<cstdio>
#include<cstring>
#include<algorithm>
#define SF scanf
#define PF printf
#define MAXN 300010
using namespace std;
char s[MAXN];
long long num[MAXN],a[MAXN];
int n;
int main(){SF("%d",&n);for(int i=1;i<=n;i++){SF("%s",&s);    int len=strlen(s);int sum=0;bool flag=0;for(int j=0;j<len;j++){if(s[j]=='(')sum++;elsesum--;if(sum<0)flag=1;}if(flag==0&&sum>=0)num[sum]++;sum=0;flag=0;for(int j=len-1;j>=0;j--){if(s[j]==')')sum++;elsesum--;if(sum<0)flag=1; }if(flag==0&&sum>=0)a[i]=sum;elsea[i]=-1;}long long ans=0;for(int i=1;i<=n;i++)if(a[i]>=0)ans+=num[a[i]];PF("%I64d",ans);
}
  相关解决方案