docs: def find_candidates(candidates):
          """
          Find candidate addresses using LCS algorithm
          perform a scoring based on how often a candidate appears in a longer candidate
  
          Input is something like
          ------------------------
          ['1b6033', '1b6033fd57', '701b603378e289', '20701b603378e289000c62',
          '1b603300', '78e289757e', '7078e2891b6033000000', '207078e2891b6033000000']
  
          Output like
          -----------
          {'1b6033': 18, '1b6033fd57': 1, '701b603378e289': 2, '207078e2891b6033000000': 1,
          '57': 1, '7078e2891b6033000000': 2, '78e289757e': 1, '20701b603378e289000c62': 1,
          '78e289': 4, '1b603300': 3}
  
          :type candidates: list of CommonRange
          :return:
          """
  
          result = defaultdict(int)
          for i, c_i in enumerate(candidates):
              for j in range(i, len(candidates)):
                  lcs = util.longest_common_substring(c_i.hex_value, candidates[j].hex_value)
                  if lcs:
                      result[lcs] += 1
  
          return result