def llaves_a_dic(l_ubics, vals):
    """
    Esta función toma una lista de ubicaciones (listas de llaves) y valores correspondientes y genera un diccionario.
    Es el opuesto de `dic_a_lista`.

    :param l_ubics: La lista de ubicaciones de valores.
    :type l_ubics: list[list[str]]
    :param vals: La lista de los valores.
    :type vals: list
    :return: El diccionario reconstruido.
    :rtype: dict
    """
    if len(l_ubics) != len(vals):
        raise ValueError(
            'La lista de ubicaciones debe tener el mismo tamaño que la lista de valores.'
            )
    dic = {}
    for val, l_llvs in zip(vals, l_ubics):
        d = dic
        for i, ll in enumerate(l_llvs):
            if i == len(l_llvs) - 1:
                d[ll] = val
            else:
                if ll not in d:
                    d[ll] = {}
                d = d[ll]
    return dic
