A bracket sequence is a string containing only characters "(" and ")".
A regular bracket sequence is a bracket sequence that can be transformed into a correct arithmetic expression by inserting characters "1" and "+" between the original characters of the sequence. For example, bracket sequences "()()", "(())" are regular (the resulting expressions are: "(1)+(1)", "((1+1)+1)"), and ")(" and "(" are not.
You are given n
bracket sequences s1,s2,…,sn. Calculate the number of pairs i,j(1≤i,j≤n) such that the bracket sequence si+sj is a regular bracket sequence. Operation +
means concatenation i.e. "()(" + ")()" = "()()()".
If si+sj
and sj+si are regular bracket sequences and i≠j, then both pairs (i,j) and (j,i) must be counted in the answer. Also, if si+si is a regular bracket sequence, the pair (i,i)
must be counted in the answer.
Input
The first line contains one integer n(1≤n≤3⋅105)
— the number of bracket sequences. The following n lines contain bracket sequences — non-empty strings consisting only of characters "(" and ")". The sum of lengths of all bracket sequences does not exceed 3⋅105
.
Output
In the single line print a single integer — the number of pairs i,j(1≤i,j≤n)
such that the bracket sequence si+sj
is a regular bracket sequence.
Examples
Input
3
)
()
(
Output
2
Input
2
()
()
Output
4
记录一下:卡我初始化。(将s数组开始初始化为0,就一直时间超限)
从n个只有 ‘(’ 和 ‘)’ 的字符串中选出两个,问能组成多少种符合规范的括号,
只有可能是 两个非完整括号 或 两个完整括号 组合
思路:先用栈处理一下字符串,相临的 '(' 和 ‘)’ 抵消掉,这种()不影响判断是否能和其他串组合成合法字符串。
处理后有四种情况:
1,只有左括号,
2,只有右括号,
3,既有左括号,又有右括号,但左括号在右边,右括号在左边,如:)(
4,什么都没有
1,2种情况 ,可以用map记录,左括号数为负数,右括号数为正数,mp【i】,右括号有i个的字符串的个数
3, 直接统计此类型的个数
4,作废
该非完整括号的字符串个数 乘 能与之配对的字符串的个数 + 完整括号的个数的平方
#include <map>
#include <set>
#include <list>
#include <cmath>
#include <stack>
#include <queue>
#include <deque>
#include <cstdio>
#include <vector>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define eps 1e-8
#define PI acos(-1)
#define INF 0x3f3f3f3f
#define N 500000 + 10
using namespace std;
const int intN = 3e5 + 10 ;
typedef long long int LL;
const int dir[4][2]= { {1,0},{0,1},{-1,0},{0,-1} };
int GCD(int a,int b)
{
return b ? GCD(b,a%b) : a;
}
int cmp(int a,int b)
{
return a>b;
}
int main()
{
stack<char>p;
map<int,LL>mp;
map<int,LL>::iterator it;
LL i,m=0,t,j,ans=0;
scanf("%lld",&t);
getchar();
for(j=0; j<t; j++)
{
char s[N];
gets(s);
for(i=0; s[i]; i++)
{
if(!p.empty())
{
if(p.top()=='(' && s[i]==')')
p.pop();
else
p.push(s[i]);
}
else
p.push(s[i]);
}
if(p.empty())
m++;
else
{
int lchar=0,rchar=0;
while(!p.empty())
{
if(p.top()=='(')
lchar++;
else if(p.top()==')')
rchar++;
p.pop();
}
if(lchar!=0 && rchar==0)
mp[-lchar]++;
else if(lchar==0 && rchar!=0)
mp[rchar]++;
}
}
for(it=mp.begin(); it!=mp.end(); it++)
{
if(mp.find( (it->first)*(-1) )!=mp.end() )
{
ans+=it->second*mp[it->first*-1];
mp[it->first*-1]=0;
}
}
printf("%lld\n",ans+m*m);
return 0;
}