#include int main() { using namespace std; ios_base::sync_with_stdio(false); string retezec_a, retezec_b; cin >> retezec_a >> retezec_b; int delka_a = retezec_a.length(); int delka_b = retezec_b.length(); int nsp_tabulka[delka_a+1][delka_b+1]; for (int a=0; a<=delka_a; ++a) for (int b=0; b<=delka_b; ++b) nsp_tabulka[a][b] = 0; for (int a=1; a<=delka_a; ++a) { for (int b=1; b<=delka_b; ++b) { nsp_tabulka[a][b] = max(max(nsp_tabulka[a-1][b], nsp_tabulka[a][b-1]), nsp_tabulka[a-1][b-1] + (retezec_a[a-1] == retezec_b[b-1] ? 1 : 0)); } } int delka_nsp = nsp_tabulka[delka_a][delka_b]; string nsp(delka_nsp, '-'); int a = delka_a; int b = delka_b; int i_nsp = delka_nsp - 1; while (a > 0 && b > 0) { if (nsp_tabulka[a][b] == nsp_tabulka[a-1][b-1] + 1) { nsp[i_nsp--] = retezec_a[a-1]; a--; b--; } else { if (nsp_tabulka[a][b] == nsp_tabulka[a-1][b]) { a--; continue; } if (nsp_tabulka[a][b] == nsp_tabulka[a][b-1]) { b--; continue; } a--; b--; } } a = 0; b = 0; i_nsp = 0; string nsn(delka_a+delka_b-delka_nsp, '-'); int i_nsn = 0; while (a < delka_a && b < delka_b) { while (retezec_a[a] != nsp[i_nsp]) { nsn[i_nsn++] = retezec_a[a++]; } while (retezec_b[b] != nsp[i_nsp]) { nsn[i_nsn++] = retezec_b[b++]; } a++; b++; nsn[i_nsn++] = nsp[i_nsp++]; } while (a < delka_a) { nsn[i_nsn++] = retezec_a[a++]; } while (b < delka_b) { nsn[i_nsn++] = retezec_b[b++]; } cout << nsn; return 0; }