-
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) 通过的代码:
#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;
}