#include #include #include FILE *input; char a [200], b[200], aa [200], bb[200]; int k , l; int read_case () { fscanf (input, "%s %s", aa, bb); if (feof (input)) return 0; k = strlen (aa); for (int i = 0; i <= k + 1; i++) a [i + 1] = aa [i]; l = strlen (bb); for (i = 0; i <= k + 1; i++) b [i + 1] = bb [i]; b [0] = 0; a [0] = 0; return 1; } int comb [200][200]; void set (int i, int j, int c) { if (comb [i][j] > c) comb [i][j] = c; } void paint_case (int i, int j) { char ans [300]; ans [comb [i][j]]= 0; while (i || j) { // printf ("%d %d %d ", i, j, comb [i][j]); if (a [i] == b [j]) { // printf ("%c\n", a[i]); ans [comb [i][j] - 1] = a [i]; i--; j--; } else if (i != 0 && comb [i - 1][j] == comb [i][j] - 1) { ans [comb [i][j] - 1] = a [i]; // printf ("%c\n", a [i]); i--; } else { // printf ("%c\n", b [j]); ans [comb [i][j] - 1] = b [j]; j--; } } printf ("%s\n", ans); } void solve_case () { int i, j; for (i = 0; i < 105; i++) for (j = 0; j < 105; j++) comb [i][j] = 100000; comb [0][0] = 0; for (i = 0; i <= k; i++){ for (j = 0; j <= l; j++) { // if (a [i] == b [j]) // { // set (i + 1, j + 1, comb [i][j] + 1); // } if (a [i + 1] == b [j] && comb [i][j - 1] < comb [i][j]) set (i + 1, j, comb [i][j]); else set (i + 1, j, comb [i][j] + 1); if (a [i] == b [j + 1] && comb [i - 1][j] < comb [i][j]) set (i, j + 1, comb [i][j]); else set (i, j+ 1, comb [i][j] + 1); } } /* for (i = 0; i <= k; i++){ printf ("%c ", a [i]); for (j = 0; j <= l; j++) { printf ("%d ", comb [i][j]); } printf ("\n"); } */ paint_case (k, l); } int main () { input = fopen ("fruits.in", "r"); assert (input != NULL); while (read_case ()) solve_case (); fclose (input); return 0; }