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>
#define _ ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
#define pb push_back
#define sz(i) (int)(i.size())
#define F first
#define S second
#define L long double
#define P pair<int, int>
const int inf = 0x3f3f3f3f3f3f3f3LL;
const int mod = (int)1e9 + 7;
using namespace std;
#if LOCAL
#include "../../tr.h"
#else
#define tr(...)
#define endl '\n'
#endif
template<class T> void smin(T& a, T val) {if (a > val) a = val;}template<class T> void smax(T& a, T val) {if (a < val) a = val;}
const int N = 1e6 + 10;

void yes(){
   cout<<"Yes"<<endl;
   //exit (0);
}
void no(){
   cout<<"No"<<endl;
   //exit (0);   
}

int n;

int32_t main(){_
   
   cin>>n;

   map<int, int> M;
   for (int i = 0; i < n; ++i)
   {
      string s;
      cin>>s;
      int bal = 0, minn = 0;
      for(auto it: s){
         bal += (it == '(');
         bal -= (it == ')');
         smin(minn, bal);
      }
      if(minn >= 0 or minn == bal){
         M[bal]++;
      }
      else{
         no();
         exit(0);
      }
   }

   M[0] %= 2;
   for (int i = 1; i <= 1e6+2; ++i)
   {
      if(M.count(i) and M.count(-i)){
         int x = min(M[i], M[-i]);
         M[i] -= x;
         M[-i] -= x;
      }
   }

   tr(M);
   int sum = 0;
   
   for (int i = 1; i <= 1e6+2; ++i)
   {
      sum += M[i] * i;
      sum += M[-i] * (-i);
   }

   if (sum == 0){
      yes();
   }
   else{
      no();
   }

   return 0;
}