Edit Distance Yet Again#11099

Edit Distance Yet Again (Discussion)

  1. user197739Sep 14, 2026, 9:26 AM

    ЦЕ КАПЕЦЬ

    1. user197739Sep 14, 2026, 9:47 AM

      user197739 import sys

      def match_len(s, t, i, j, n, m):c = 0while i < n and j < m and s[i] == t[j]:i += 1; j += 1; c += 1return c

      NEG = -1

      def solve(s, t, n, m, k):if abs(n - m) > k:return Nonetarget_d = m - n

      dp = [] 
      l0 = match_len(s, t, 0, 0, n, m)
      dp.append([l0])
      found_D = 0 if (target_d == 0 and l0 == n) else None
      
      if found_D is None:
          for e in range(1, k + 1):
              prev = dp[e - 1]
              pe = e - 1
              cur = [NEG] * (2 * e + 1)
              for d in range(-e, e + 1):
                  best = NEG
                  if -pe <= d <= pe:
                      v = prev[d + pe]
                      if v != NEG and v + 1 > best:
                          best = v + 1
                  if -pe <= d - 1 <= pe:
                      v = prev[(d - 1) + pe]
                      if v != NEG and v > best:
                          best = v
                  if -pe <= d + 1 <= pe:
                      v = prev[(d + 1) + pe]
                      if v != NEG and v + 1 > best:
                          best = v + 1
                  if best == NEG:
                      continue
                  i0 = best
                  if i0 < 0 or i0 > n:
                      continue
                  j0 = i0 + d
                  if j0 < 0 or j0 > m:
                      continue
                  i0 += match_len(s, t, i0, j0, n, m)
                  cur[d + e] = i0
              dp.append(cur)
              if -e <= target_d <= e and cur[target_d + e] == n:
                  found_D = e
                  break
      
      if found_D is None:
          return None
      
      D = found_D
      moves = []
      e = D
      d = target_d
      while e > 0:
          prev = dp[e - 1]
          pe = e - 1
          subst = NEG
          if -pe <= d <= pe:
              v = prev[d + pe]
              if v != NEG:
                  subst = v + 1
          ins = NEG
          if -pe <= d - 1 <= pe:
              v = prev[(d - 1) + pe]
              if v != NEG:
                  ins = v
          dele = NEG
          if -pe <= d + 1 <= pe:
              v = prev[(d + 1) + pe]
              if v != NEG:
                  dele = v + 1
          i_move = max(subst, ins, dele)
          if subst == i_move:
              i0 = i_move - 1
              j0 = i0 + d
              moves.append(('R', i0, j0))
          elif ins == i_move:
              i0 = i_move
              j0 = i0 + (d - 1)
              moves.append(('I', i0, j0))
              d = d - 1
          else:
              i0 = i_move - 1
              j0 = i0 + (d + 1)
              moves.append(('D', i0, j0))
              d = d + 1
          e -= 1
      
      moves.reverse()
      
      ops = []
      pos = 1
      prev_i = 0
      for (typ, i0, j0) in moves:
          pos += (i0 - prev_i)
          if typ == 'R':
              ops.append("REPLACE %d %s" % (pos, t[j0]))
              pos += 1
              prev_i = i0 + 1
          elif typ == 'I':
              ops.append("INSERT %d %s" % (pos, t[j0]))
              pos += 1
              prev_i = i0
          else:
              ops.append("DELETE %d" % pos)
              prev_i = i0 + 1
      return ops

      def main():data = sys.stdin.buffer.read().split()idx = 0z = int(data[idx]); idx += 1out = []for _ in range(z):n = int(data[idx]); m = int(data[idx+1]); k = int(data[idx+2])idx += 3s = data[idx].decode(); idx += 1t = data[idx].decode(); idx += 1res = solve(s, t, n, m, k)if res is None:out.append("NO")else:out.append("YES")out.append(str(len(res)))out.extend(res)sys.stdout.write("\n".join(out) + "\n")

      if name == "main":main()