CodeForces 990C

Description

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 nn bracket sequences s1,s2,,sns1,s2,…,sn. Calculate the number of pairs i,j(1i,jn)i,j(1≤i,j≤n) such that the bracket sequence si+sjsi+sj is a regular bracket sequence. Operation ++ means concatenation i.e. "()(" + ")()" = "()()()".

If si+sjsi+sj and sj+sisj+si are regular bracket sequences and iji≠j, then both pairs (i,j)(i,j) and (j,i)(j,i) must be counted in the answer. Also, if si+sisi+si is a regular bracket sequence, the pair (i,i)(i,i) must be counted in the answer.

Input

The first line contains one integer n(1n3105)n(1≤n≤3⋅105) — the number of bracket sequences. The following nn lines contain bracket sequences — non-empty strings consisting only of characters "(" and ")". The sum of lengths of all bracket sequences does not exceed 31053⋅105.

Output

In the single line print a single integer — the number of pairs i,j(1i,jn)i,j(1≤i,j≤n) such that the bracket sequence si+sjsi+sj is a regular bracket sequence.

Sample Input

Input
3
)
()
(
Output
2
Input
2
()
()
Output
4

Hint

In the first example, suitable pairs are (3,1)(3,1) and (2,2)(2,2).

In the second example, any pair is suitable, namely (1,1),(1,2),(2,1),(2,2)(1,1),(1,2),(2,1),(2,2).

 

括号匹配问题,需要注意几个细节。

有以下几种情况是不能与其他组括号构成合法的括号:)(         )(((      )))(

已经是合法的括号组不需要与不合法的括号组匹配。

 

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<algorithm>
 6 #include<queue>
 7 #include<stack>
 8 #include<deque>
 9 #include<map>
10 #include<iostream>
11 using namespace std;
12 typedef long long  LL;
13 const double pi=acos(-1.0);
14 const double e=exp(1);
15 const int N = 300010;
16 
17 #define lson i << 1,l,m
18 #define rson i << 1 | 1,m + 1,r
19 
20 map<LL,LL> mp;
21 char con[N];
22 int main()
23 {
24     LL i,p,j,n,check;
25     LL cont=0,ans=0,len1,len2;
26     scanf("%lld",&n);
27     getchar();
28     for(j=1;j<=n;j++)
29     {
30         p=check=0;
31         len1=len2=0;
32         memset(con,0,sizeof(0));
33         scanf("%s",con);
34         for(i=0;i<300009;i++)
35         {
36             if(con[i]==0)
37                 break;
38             if(con[i]=='(')
39             {
40                 len1++;
41                 p++;
42             }
43             else
44             {
45                 p--;
46                 if(len1)
47                     len1--;
48                 else
49                     len2++;
50             }
51         }
52         if(len1==0&&len2==0)
53             cont++;
54         else
55         {
56             if(len1==0)
57                 mp[p]++;
58             if(len2==0)
59                 mp[p]++;
60         }
61     }
62     ans=cont*cont;
63 
64     map<LL,LL>::iterator it1;
65     for(it1=mp.begin();it1!=mp.end();it1++)
66     {
67         if(it1->first>0)
68             break;
69         if(mp[-(it1->first)]>0)
70             ans+=(it1->second)*mp[-(it1->first)];
71     }
72     printf("%lld\n",ans);
73     return 0;
74 }
View Code

 

   

posted @ 2018-08-05 15:58  Daybreaking  阅读(262)  评论(0编辑  收藏  举报