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: Runtime Error)

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

#[fastout]
fn main() {
   input! {
      n: usize,
      mut s: [Chars; n]
   }
   let mut x = Vec::new();
   for i in 0..n {
      let mut l = 0;
      {
         let mut _l = 0;
         let mut _r = 0;
         for c in s[i].iter() {
            if *c == ')' {
               _l += 1;
            } else {
               if _l >= 0 {
                  l += _l;
               }
               _l -= 1;
            }
         }
         if _l >= 0 {
            l += _l;
         }
      }
      s[i].reverse();
      let mut r = 0;
      {
         let mut _l = 0;
         let mut _r = 0;
         for c in s[i].iter() {
            if *c == '(' {
               _l += 1;
            } else {
               if _l >= 0 {
                  r += _l;
               }
               _l -= 1;
            }
         }
         if _l >= 0 {
            r += _l;
         }
      }
      x.push((l, r));
   }
   x.sort();
   let mut state;
   let mut left;
   let mut right;
   if n % 2 == 1 {
      state = x[n / 2];
      left = n/2;
      right = n/2+1;
   } else {
      state = union(x[n / 2 - 1], x[n/2]);
      left = n/2-1;
      right = n/2;
   }

   while left > 0 {
      left -= 1;
      right += 1;
      state = union(x[left], state);
      state = union(state, x[right]);
   }
   if state == (0, 0) {
      println!("Yes");
   } else {
      println!("No");
   }
}

fn union(a: (i64, i64), b: (i64, i64)) -> (i64, i64) {
   if a.1 > b.0 {
      (a.0, b.1 + a.1 - b.0)
   } else {
      (a.0 + b.0 - a.1, b.1)
   }
}