fork download
  1. def getMinErrors(errorString, x, y):
  2. MOD = 10**9 + 7
  3.  
  4. # dp0 = (min errors ending with '0', zeros, ones)
  5. # dp1 = (min errors ending with '1', zeros, ones)
  6. dp0 = (0, 0, 0)
  7. dp1 = (0, 0, 0)
  8.  
  9. for c in errorString:
  10. if c == '0':
  11. new_dp0 = (dp0[0] + y * dp0[2], dp0[1] + 1, dp0[2])
  12. new_dp1 = (float('inf'), 0, 0)
  13. elif c == '1':
  14. new_dp0 = (float('inf'), 0, 0)
  15. new_dp1 = (dp1[0] + x * dp1[1], dp1[1], dp1[2] + 1)
  16. else: # '!'
  17. # Try as '0'
  18. cand0_1 = (dp0[0] + y * dp0[2], dp0[1] + 1, dp0[2])
  19. cand0_2 = (dp1[0] + y * dp1[2], dp1[1] + 1, dp1[2])
  20. best0 = cand0_1 if cand0_1[0] < cand0_2[0] else cand0_2
  21.  
  22. # Try as '1'
  23. cand1_1 = (dp0[0] + x * dp0[1], dp0[1], dp0[2] + 1)
  24. cand1_2 = (dp1[0] + x * dp1[1], dp1[1], dp1[2] + 1)
  25. best1 = cand1_1 if cand1_1[0] < cand1_2[0] else cand1_2
  26.  
  27. new_dp0 = best0
  28. new_dp1 = best1
  29.  
  30. dp0 = (new_dp0[0] % MOD, new_dp0[1], new_dp0[2])
  31. dp1 = (new_dp1[0] % MOD, new_dp1[1], new_dp1[2])
  32.  
  33. return min(dp0[0], dp1[0]) % MOD
  34.  
  35. print(getMinErrors('0!!1!1', 2, 3)) # Output: 10
  36. print(getMinErrors('!!!!!!', 23, 47)) # Output: 0
  37. print(getMinErrors('1011!', 2, 3)) # Output: 9
Success #stdin #stdout 0.12s 14024KB
stdin
10
aba
geeksforgeeks
geeksforgeeks
geeksforgeeks
geeksforgeeks
geeksforgeeks
geeksforgeeks
geeksforgeeks
geeksforgeeks
geeksforgeeks
stdout
nan
0
nan