// Subsecuencia común más larga: la tabla, dos reconstrucciones y la diferencia con una subcadena.
#include <iomanip>
#include <iostream>
#include <string>

#include "sequences.h"

namespace {

void print_table(const std::string& a, const std::string& b, const Table& table) {
    std::cout << "    ";
    for (char c : b) std::cout << std::setw(2) << c;
    std::cout << '\n';
    for (std::size_t i = 0; i <= a.size(); i++) {
        std::cout << (i == 0 ? ' ' : a[i - 1]) << " ";
        for (std::size_t j = 0; j <= b.size(); j++) std::cout << std::setw(2) << table[i][j];
        std::cout << '\n';
    }
}

}  // namespace

int main() {
    const std::string a = "algoritmo";
    const std::string b = "logaritmo";
    const Table lcs = lcs_table(a, b);
    print_table(a, b, lcs);
    std::cout << "\nLargo: " << lcs[a.size()][b.size()] << '\n';
    std::cout << "Hacia atrás, prefiriendo subir:    " << lcs_walk(a, b, lcs, true) << '\n';
    std::cout << "Hacia atrás, prefiriendo la izquierda: " << lcs_walk(a, b, lcs, false) << '\n';
    std::cout << "Subcadena común más larga:         " << longest_common_substring(a, b) << '\n';
}
