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)

#[warn(unused_imports)]
use proconio::{
   fastout, input,
   marker::{Bytes, Chars, Isize1, Usize1},
};
use std::cmp::{min, Reverse};

#[fastout]
fn main() {
   input! {
      n: usize,
      mut s: [Chars; n]
   }
   let mut pos = Vec::new();
   let mut neg = Vec::new();
   for i in 0..n {
      let mut mn = 0;
      let mut h = 0;
      for c in s[i].iter() {
         if *c == ')' {
            h -= 1;
            mn = min(mn, h);
         } else {
            h += 1;
         }
      }
      if h > 0 {
         pos.push((mn as i64, h as i64));
      } else {
         neg.push(((mn - h) as i64, -h as i64));
      }
   }

   pos.sort_by_key(|&(a, b)| (Reverse(a), b));
   let mut pp = 0;
   for (mn, h) in pos.iter().copied() {
      if pp + mn < 0 {
         println!("No");
         return;
      }
      pp += h;
   }

   neg.sort_by_key(|&(a, b)| (Reverse(a), b));
   let mut pn = 0;
   for (mn, h) in neg.iter().copied() {
      if pn + mn < 0 {
         println!("No");
         return;
      }
      pn += h;
   }

   if pp == pn {
      println!("Yes");
   } else {
      println!("No");
   }
}