I will describe the O (n ^ 4) -time solution and -dimensional dynamic programming (which can be easily improved to use only the O (n ^ 3) space), which should work up to n = 100 or so.
A subsequence call is “fresh” if it consists of one ;.
"", .
"", . (, ;, ;_ ;___ - , _, ;; ;___;; - .)
, "", , .
f (i, j, k, m) - j + k + m , j , k - m . , i, j, k m - , (i, j, k, m), , (i, j, k, m) , , . , 1 <= j <= n of f (n, 0, j, 0).
If s[i] = "_":
f(i, j, k, m) =
(j+1) * f(i-1, j+1, k, m-1)
+ m * f(i-1, j, k, m)
Else if s[i] = ";":
f(i, j, k, m) =
f(i-1, j-1, k, m)
+ (m+1) * f(i-1, j, k-1, m+1)
f(0, 0, 0, 0) = 1
f(0, _, _, _) = 0
f(i, j, k, m) = 0 if any of i, j, k or m are negative
++ 36 ;;;___;;; , , ;;;___;;;_;_; 540 ( ). , 66 ;, 66 _, 66 ; s, 2 0 (, - long long).