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::literals::string_literals;
using i64 = std::int_fast64_t;
using std::cout;
using std::cerr;
using std::endl;
using std::cin;

template<typename T>
std::vector<T> make_v(size_t a){return std::vector<T>(a);}

template<typename T,typename... Ts>
auto make_v(size_t a,Ts... ts){
  return std::vector<decltype(make_v<T>(ts...))>(a,make_v<T>(ts...));
}

int main() {
	int n; scanf("%d", &n); std::vector<std::string> s(n);
	for(auto& v: s) cin >> v;
	

	std::vector<std::pair<int, int>> pos;
	std::vector<std::pair<int, std::pair<int, int>>> neg;
	for(auto t: s) {
		int min = 0, plus = 0;
		for(auto c: t) {
			plus += (c == '(');
			plus -= (c == ')');
			min = std::min(min, plus);
		}

		if(plus >= 0) {
			pos.push_back({min, plus});
		} else {
			int miiin = min, pluuus = plus;
			min = plus = 0;
			reverse(begin(t), end(t));
			for(auto c: t) {
				plus += (c == '(');
				plus -= (c == ')');
				min = std::min(min, plus);
			}
			
			neg.push_back({min, {miiin, pluuus}});
		}
	}
	sort(begin(pos), end(pos), std::greater<>());
	sort(begin(neg), end(neg));
	
	int now = 0;
	bool ans = true;
	for(auto v: pos) {
		if(now + v.first < 0) ans = false;
		now += v.second;
	}
	for(auto v: neg) {
		if(now + v.second.first < 0) ans = false;
		now += v.second.second;
	}
	ans &= (now == 0);

	if(ans) printf("Yes\n");
	else printf("No\n");
	return 0;
}