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)

use proconio::{
   fastout, input,
   marker::{Bytes, Chars, Isize1, Usize1},
};

fn main() {
   input! {
      n:usize
   }
   let mut v = vec![];
   for _ in 0..n {
      let mut l = 0_isize;
      let mut r = 0_isize;
      input! {
         c:Chars
      }
      for i in c {
         if i == '(' {
            r += 1;
         } else {
            if r > 0 {
               r -= 1;
            } else {
               l += 1;
            }
         }
      }
      v.push((l, r));
   }

   //dbg![&v];
   if v.iter().map(|z| z.0).sum::<isize>() != v.iter().map(|z| z.1).sum::<isize>() {
      println!("No");
      return;
   }
   let mut l = 0;
   let mut r = 0;

   let mut lc = 0;
   v.sort_by(|x, y| {
      if x.0 == y.0 {
         y.1.cmp(&x.1)
      } else {
         x.0.cmp(&y.0)
      }
   });
   for (i, j) in v {
      if j == 0 {
         lc += i;
      } else {
         if r <= i {
            r = j + i - r;
         } else {
            l = l + i - r;
            r = j;
         }
      }
   }
   //println!("{} {} {}", l, r, lc);
   if l == 0 && lc == r {
      println!("Yes");
   } else {
      println!("No");
   }
}