Problem:
Score : 600 points

Problem Statement

A bracket sequence is a string that is one of the following:

An empty string;

The concatenation of (, A, and ) in this order, for some bracket sequence A ;

The concatenation of A and B in this order, for some non-empty bracket sequences A and B /

Given are N strings S_i. Can a bracket sequence be formed by concatenating all the N strings in some order?

Constraints

1 \leq N \leq 10^6

The total length of the strings S_i is at most 10^6.

S_i is a non-empty string consisting of ( and ).

Input

Input is given from Standard Input in the following format:

N
S_1
:
S_N

Output

If a bracket sequence can be formed by concatenating all the N strings in some order, print Yes; otherwise, print No.

Sample Input 1

2
)
(()

Sample Output 1

Yes

Concatenating (() and ) in this order forms a bracket sequence.

Sample Input 2

2
)(
()

Sample Output 2

No

Sample Input 3

4
((()))
((((((
))))))
()()()

Sample Output 3

Yes

Sample Input 4

3
(((
)
)

Sample Output 4

No

Solution in C++ (GCC 9.2.1) (judge verdict: Wrong Answer)

#include <bits/stdc++.h>
using namespace std;

#define pb push_back
#define S second
#define F first
#define f(i,n) for(int i=0;i<n;i++)
#define fast ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define vi vector<int>
#define pii pair<int,int>

void solve()
{
   int n;
    cin >> n;
    
    string s;
    
    vector<pii> go;
    
    while(n--)
    {
        cin >> s;
        
        int pos = 0;
        int neg = 0;
        int cnt = 0;
        
        for(auto x : s)
        {
            if(cnt == 0)
            {
                if(x == ')') neg++;
                else cnt++;
            }
            else
            {
                if(x == ')') cnt--;
                else cnt++;
            }
        }
        
        pos = cnt;
        
        go.pb({neg,pos});
    }
    
    int ff = 1;
    
    for(auto x : go)
        if(x.F > 0 || x.S > 0) ff = 0;
    
    if(ff == 1)
    {
        cout <<"Yes";
        return;
    }
          
    int flag = 1;
    
    int cur = 0;
    
    int flag1 = 0;
    int flag2 = 0;
    
    for(auto x : go)
        if(x.F == 0 && x.S > 0) flag1 = 1;
        
    for(auto x : go)
        if(x.S == 0 && x.F > 0) flag2 = 1;
    
    flag&=flag1;
    flag&=flag2;
    
    
    for(auto x : go) cur+=x.S-x.F;
    
    
    flag&=(cur == 0);
        
    if(flag == 1) cout <<"Yes";
    else cout <<"No";
        
}

signed main()
{
    fast;
    
    int t = 1;
    
//    cin >> t;
    
    while(t--)
        
    solve();
}