exp.go 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. package main
  2. import "fmt"
  3. const MOD int = 1000000007
  4. func main() {
  5. var s1, s2 string
  6. fmt.Scanln(&s1)
  7. fmt.Scanln(&s2)
  8. lb := 0
  9. for _, r := range s1 {
  10. if r == '(' {
  11. lb++
  12. } else {
  13. lb--
  14. }
  15. }
  16. for _, r := range s2 {
  17. if r == '(' {
  18. lb++
  19. } else {
  20. lb--
  21. }
  22. }
  23. if lb != 0 {
  24. fmt.Println(0)
  25. return
  26. }
  27. m := make(map[[3]int]int)
  28. res := dfs([]rune(s1), []rune(s2), len(s1), len(s2), 0, 0, 0, m)
  29. fmt.Println(res)
  30. }
  31. func dfs(s1, s2 []rune, l1, l2, i1, i2, lb int, m map[[3]int]int) int {
  32. if i1 == l1 && i2 == l2 {
  33. if lb == 0 {
  34. return 1
  35. }
  36. return 0
  37. }
  38. if v, ok := m[[3]int{i1, i2, lb}]; ok {
  39. return v
  40. }
  41. res := 0
  42. if i1 < l1 {
  43. if s1[i1] == '(' {
  44. res = (res + dfs(s1, s2, l1, l2, i1+1, i2, lb+1, m)) % MOD
  45. } else if lb != 0 {
  46. res = (res + dfs(s1, s2, l1, l2, i1+1, i2, lb-1, m)) % MOD
  47. }
  48. }
  49. if i2 < l2 {
  50. if s2[i2] == '(' {
  51. res = (res + dfs(s1, s2, l1, l2, i1, i2+1, lb+1, m)) % MOD
  52. } else if lb != 0 {
  53. res = (res + dfs(s1, s2, l1, l2, i1, i2+1, lb-1, m)) % MOD
  54. }
  55. }
  56. m[[3]int{i1, i2, lb}] = res
  57. return res
  58. }