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 rep(i, n) for (int i = 0; i < n; i++)
#define MOD 1000000007
#define MOD2 998244353
#define INF ((1<<30)-1)
#define LINF (1LL<<60)
#define EPS (1e-10)
typedef long long Int;
typedef pair<Int, Int> P;

void str_replace(string &s, string target, string replacement) {
    if (!target.empty()) {
        string::size_type pos = 0;
        while ((pos = s.find(target, pos)) != string::npos) {
            s.replace(pos, target.length(), replacement);
            pos += replacement.length();
        }
    }
}

int main() {
    int n;
    cin >> n;
    Int lef = 0; // (
    Int rig = 0; // )
    Int rig_part = 0;
    Int double_part = 0;
    Int lef_part = 0;
    rep(i,n) {
        string s;
        cin >> s;
        while (s.find("()") != string::npos) {
            str_replace(s, "()", "");
        }
        for (char c : s) {
            if (c == '(') lef++;
            else rig++;
        }
        if (s.front() == '(' && s.back() == '(') lef_part++;
        if (s.front() == ')' && s.back() == ')') rig_part++;
        if (s.front() == ')' && s.back() == '(') double_part++;
    }
    if (double_part > 0) {
        if (rig == lef && lef_part > 0 && rig_part > 0) {
            cout << "Yes" << endl;
        }
        else {
            cout << "No" << endl;
        }
    }
    if (double_part == 0){
        if (rig == lef && rig_part == lef_part) {
            cout << "Yes" << endl;
        }
        else {
            cout << "No" << endl;
        }
    }
}