传送门:点击打开链接
题意:给n(3e5)个字符串,求(i, j)组合是合法的括号序列的个数。
分析:最后只剩四种序列(①序列为合法,②序列只有'(',③序列只有')',④序列包含两种括号任意个。),组合一下就好了,算出每种的贡献求和。
代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<set>
#include<map>
#include<stack>
#include<queue>
using namespace std;
const int N = 3e5+10;
#define ll long long
#define pb push_back
#define inf 0x3f3f3f3f
#define eps 1e-10
int n;
ll ans;
int main() {
ios::sync_with_stdio(0);
while(cin>>n) {
map<ll,ll> ma;
ll cnt0=0;
for(int i=0;i<n;i++) {
string s;
cin>>s;
int l=0,r=0;
for(int j=0;j<s.size();j++) {
if(s[j]=='(') l++;
else {
if(l>0) l--;
else r++;
}
}
if(l==0&&r==0) cnt0++;
else if(l==0) ma[r]++;
else if(r==0) ma[-l]++;
}
for(int i=1;i<=N;i++)
ans += ma[-i]*ma[i];
ans += cnt0*cnt0;
cout<<ans<<endl;
}
return 0;
}