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 Ruby (2.7.1) (judge verdict: Time Limit Exceeded)

def no
  puts "No"
  exit
end

def check(ary, lt)
  n = ary.size
  return true if n == 0
  return false if ary[0][0] > lt
  n.times do |i|
    aa = ary.dup
    aa.delete_at(i)
    return true  if check(aa, lt - ary[i][0] + ary[i][1])
  end
  return false
end

  n = gets.strip.to_i
  s = []
  n.times { s.append gets.strip }
  
  t = []
  lt, rt = 0, 0
  n.times do |i|
    l, r = 0, 0
    s[i].each_char do |c|
      case c
      when '('
        l += 1
      when ')'
        if l > 0
          l -= 1 
        else
          r += 1
        end
      end
    end
    t.append [r, l]
    lt += l
    rt += r
  end
  
  no if lt != rt
  
  lt, rt = 0, 0
  tp, tm = [], []
  t.each do |a|
    if a[1] == 0
      if a[0] != 0
        rt += a[0]
      end
    elsif a[0] == 0
      lt += a[1]
    else
      if a[1] - a[0] > 0
        tp.append a
      else
        tm.append a
      end
    end
  end
  
  tp.sort.each do |a|
    if lt >= a[0]
      lt += a[1] - a[0]
    else
      no
    end
  end
  
  tm.sort!.reverse!
  if check(tm,lt)
    puts "Yes"
  else
    puts "No"
  end