466.count-the-repetitions.go 859 B

1234567891011121314151617181920212223242526272829303132333435
  1. func getMaxRepetitions(s1 string, n1 int, s2 string, n2 int) int {
  2. // dp[i][k] = dp[i][k-1] + dp[(i+dp[i][k-1])%m][k-1], m = len(s1)
  3. // dp[i][k] means the length required to match 2^k of s2
  4. // from the ith char of s1.
  5. m, n := len(s1), len(s2)
  6. r1, r2 := []rune(s1), []rune(s2)
  7. dp := make([][]int, m)
  8. for i := range dp {
  9. dp[i] = make([]int, 31) // 2^30 is the limit, cauz MaxInt32 < 2^31
  10. }
  11. for i := 0; i < m; i++ {
  12. l1, l2 := i, 0
  13. for l2 < n { // Match 2^0 of s2
  14. for l1 < n1*m && r1[l1%m] != r2[l2] {
  15. l1++
  16. }
  17. l1, l2 = l1+1, l2+1
  18. }
  19. dp[i][0] = l1 - i
  20. }
  21. for k := 1; k < 31; k++ {
  22. for i := 0; i < m; i++ {
  23. dp[i][k] = dp[i][k-1] + dp[(i+dp[i][k-1])%m][k-1]
  24. }
  25. }
  26. ans := int64(0)
  27. beg := 0
  28. for k := 30; 0 <= k; k-- {
  29. for beg+dp[beg%m][k] <= n1*m {
  30. ans += 1 << uint(k)
  31. beg += dp[beg%m][k]
  32. }
  33. }
  34. return int(ans) / n2
  35. }