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: Wrong Answer)

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

#[fastout]
fn main() {
   input! {
      n: usize,
      mut s: [Chars; n]
   }
   let mut x = Vec::new();
   let mut tot = 0;
   let mut lf = false;
   let mut rf = false;
   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;
         }
      }
      if l == 0 && r != 0 {
         lf = true;
      }
      if r == 0 && l != 0 {
         rf = true;
      }
      tot += l - r;
      x.push((l, r));
   }
   if tot == 0 && lf && rf {
      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)
   }
}