1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- package main
- import "fmt"
- const MOD int = 1000000007
- func main() {
- var s1, s2 string
- fmt.Scanln(&s1)
- fmt.Scanln(&s2)
- lb := 0
- for _, r := range s1 {
- if r == '(' {
- lb++
- } else {
- lb--
- }
- }
- for _, r := range s2 {
- if r == '(' {
- lb++
- } else {
- lb--
- }
- }
- if lb != 0 {
- fmt.Println(0)
- return
- }
- m := make(map[[3]int]int)
- res := dfs([]rune(s1), []rune(s2), len(s1), len(s2), 0, 0, 0, m)
- fmt.Println(res)
- }
- func dfs(s1, s2 []rune, l1, l2, i1, i2, lb int, m map[[3]int]int) int {
- if i1 == l1 && i2 == l2 {
- if lb == 0 {
- return 1
- }
- return 0
- }
- if v, ok := m[[3]int{i1, i2, lb}]; ok {
- return v
- }
- res := 0
- if i1 < l1 {
- if s1[i1] == '(' {
- res = (res + dfs(s1, s2, l1, l2, i1+1, i2, lb+1, m)) % MOD
- } else if lb != 0 {
- res = (res + dfs(s1, s2, l1, l2, i1+1, i2, lb-1, m)) % MOD
- }
- }
- if i2 < l2 {
- if s2[i2] == '(' {
- res = (res + dfs(s1, s2, l1, l2, i1, i2+1, lb+1, m)) % MOD
- } else if lb != 0 {
- res = (res + dfs(s1, s2, l1, l2, i1, i2+1, lb-1, m)) % MOD
- }
- }
- m[[3]int{i1, i2, lb}] = res
- return res
- }
|