code: def longest_common_subsequence(a, b, mergefunc=None):
      if mergefunc is None:
          def mergefunc(a, b):
              if a == b:
                  return a
              return None
      eq = {}
      for ai, aval in enumerate(a):
          for bi, bval in enumerate(b):
              eq[ai, bi] = mergefunc(aval, bval)
      prefix_lcs_length = {}
      for ai in range(-1, len(a)):
          for bi in range(-1, len(b)):
              if ai == -1 or bi == -1:
                  l = 0
              elif eq[ai, bi]:
                  l = prefix_lcs_length[ai - 1, bi - 1] + 1
              else:
                  l = max(
                      prefix_lcs_length[ai, bi - 1],
                      prefix_lcs_length[ai - 1, bi])
              prefix_lcs_length[ai, bi] = l
      ai = len(a) - 1
      bi = len(b) - 1
      ret = []
      while ai >= 0 and bi >= 0:
          merged = eq[ai, bi]
          if merged is not None:
              ret.append((ai, bi, merged))
              ai -= 1
              bi -= 1
          elif prefix_lcs_length[ai, bi - 1] > prefix_lcs_length[ai - 1, bi]:
              bi -= 1
          else:
              ai -= 1
      ret.reverse()
      return ret