C Bracket Sequences Concatenation Problem
思路:一个字符串S,需要判断 它左边需要多少“(” 右边需要多少“)” 。为了配对成完整的,(i,j)或者(j,i) 其中s[i],或者 s[j],左右两边一定有一方(或两方)需要的数目为0,然后如果(i,j)可以配对,s[i]的R[i]==s[j]的L[i] 且L[i]=R[j]=0 。ok 接下来就可以开始计算了。
代码
C++ 11
#include <iostream>
#include <queue>
#include <algorithm>
#include <string>
using namespace std;
long long L[300000+10];
long long R[300000+10];
int main() {
int n;
string s;
cin>>n;
long long cnt =0;
for(int i=0;i<300000+10;i++) L[i]=R[i]=0;
for(int i=0;i<n;i++){
cin>>s;
int l = 0;
int r = 0;
for(int i=0;i<s.size();i++){
if(s[i]==')'&&r>0) r--;
else if(s[i]==')'&&r<=0) l++;
else if(s[i]=='(') r++;
}
if(l==0&&r==0) cnt+=1;
else if(l==0) R[r]+=1;
else if(r==0) L[l]+=1;
}
long long ans = cnt*cnt;
for(int i=0;i<300000+10;i++){
ans += R[i]*L[i];
}
cout<<ans<<endl;
return 0;
}
Python 3.7
from collections import defaultdict
if __name__ == "__main__":
n = int(input())
cnt = 0
L = defaultdict(int)
R = defaultdict(int)
for i in range(0,n):
s = list(input())
l = 0
r = 0
for item in s:
if item == '(' : r += 1
elif item == ')' and r>0: r -= 1
elif item == ')': l += 1
if l==0 and r==0: cnt+=1
elif l==0: R[r] += 1
elif r==0: L[l] += 1
ans = cnt*cnt
for item in L:
ans += L[item]*R[item]
print(ans)