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 Rust (1.42.0) (judge verdict: Accepted)

fn main() {
	let mut s = String::new();
	use std::io::Read;
	std::io::stdin().read_to_string(&mut s).unwrap();
	let mut s = s.split_whitespace();
	let n: usize = s.next().unwrap().parse().unwrap();
	let mut up = vec![];
	let mut down = vec![];
	let mut all = 0;
	for s in s.take(n) {
		let mut min = 0;
		let mut delta = 0;
		for c in s.chars() {
			if c == '(' {
				delta += 1;
			} else {
				delta -= 1;
				if delta < min {
					min = delta;
				}
			}
		}
		if delta > 0 {
			up.push((min, delta));
		} else {
			down.push((min - delta, -delta));
		}
		all += delta;
	}
	if all != 0 {
		println!("No");
		return;
	}
	up.sort_by_key(|a| std::cmp::Reverse(a.0));
	down.sort_by_key(|a| std::cmp::Reverse(a.0));
	let mut cur = 0;
	for (min, delta) in up {
		if cur + min < 0 {
			println!("No");
			return;
		}
		cur += delta;
	}
	let mut cur = 0;
	for (min, delta) in down {
		if cur + min < 0 {
			println!("No");
			return;
		}
		cur += delta;
	}
	println!("Yes");
}