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 JavaScript (Node.js 12.16.1) (judge verdict: Wrong Answer)


let input = require("fs").readFileSync("/dev/stdin", "utf8")

function main() {
    const [N] = load(1)
    const S = load(N,1,String)
    
    for(let i = 0; i < N; i++) {
        while(true) {
            let before = S[i]
            S[i] = S[i].split('()').join('')
            if(before !== S[i]) continue
            break
        }
    }

    for(let i = 0; i < N; i++) {
        const s = S[i]
        let dec = s.indexOf('(')
        if(dec === -1) dec = s.length
        S[i] = [-dec, s.length - dec]
    }

    S.sort((a,b) => (b[0]+b[1]) - (a[0]+a[1]))

    let sum = 0
    for(const s of S) {
        sum += s[0]
        if(sum < 0) return 'No'
        sum += s[1]
    }

    return yesno(sum === 0)
}

/*

入力値を読み込む
load(rows = 1, cols = 1, type = Number)

TruthyならYes, FalsyならNo
yesno(boolean) => String

*/


let inputs = input.split(/[\s\n]/)
console.log(main())


// 入力値を読み込む
function load(rows = 1, cols = 1, type = Number) {
    const length = rows * cols
    let result = inputs.splice(0, length)

    if(type !== String) result = result.map(type)
    if(cols > 1) {
        const arrays = new Array(cols)
        for(let col = 0; col < cols; col++) {
            arrays[col] = new Array()
            for(let row = 0; row < rows; row++) {
                arrays[col].push(result[row * cols + col])
            }
        }
        result = arrays
    }

    return result
}

// TruthyならYes, FalsyならNo
function yesno(value) {
    return value ? 'Yes' : 'No'
}