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)

fn main() {
    proconio::input! {
        n: usize,
        s: [proconio::marker::Bytes;n],
    }
    let mut d: Vec<(i32,i32)>=Vec::with_capacity(n);
    let mut e: Vec<(i32,i32)>=Vec::with_capacity(n);
    for s in s {
        let mut m=0;
        let mut k=0;
        let f=s[s.len()-1]==b')';
        for c in s {
            k += if c==b'(' {1} else {-1};
            m = std::cmp::min(m,k);
        }
        if f {
            d.push((m,k));
        }
        else {
            e.push((m,k));
        }
    }
    d.sort();
    let mut j=n;
    for i in (0..d.len()).rev() {
        if d[i].0>=d[i].1 {
            j=i;
            break;
        }
    }
    if j==n {
        println!("No");
        return;
    }
    let a=d.remove(j);
    d.extend(e);
    d.sort();
    d.reverse();
    let mut i=0;
    let mut q=Vec::new();
    for (m,k) in d {
        if i+m>=0 && i+k>=0 {
            i+=k;
        }
        else {
            q.push((m,k));
        }
    }
    let mut c=0;
    for (m,k) in q {
        if i+m>=0 && i+k>=0 {
            i+=k;
        }
        else {
            c+=1;
            break;
        }
    }
    let f = c==0 && i+a.0>=0 && i+a.1==0;
    println!("{}", if f {"Yes"} else {"No"});
}