#include #include #include char a[1000000][15]; char b[1000000][15]; int lasta, lastb; int i; int min[10000000]; int index(int i, int j); void tiskni(int i, int j); int main() { while(1) { i = 0; while (1) { scanf("%s ", a[i]); if (a[i][0] == '.') { if (i == 0) return 0; else { lasta = i; break; } } i++; } i = 0; while (1) { scanf("%s ", b[i]); if (b[i][0] == '.') { lastb = i; break; } i++; } /*for (int i = 0; i < lasta; i++) printf("%s\n", a[i]); for (int i = 0; i < lastb; i++) printf("%s\n", b[i]);*/ for (int i = 0; i <= (lasta+1)*(lastb+1); i++) min[i] = 0; for (int i = 0; i <= lasta; i++) min[index(i, 0)] = i; for (int i = 0; i <= lastb; i++) min[index(0, i)] = i; for (int i = 1; i <= lasta; i++) { for (int j = 1; j <= lastb; j++) { min[index(i,j)] = std::min(min[index(i-1,j)], min[index(i, j-1)]) + 1; if (strcmp(a[lasta - i], b[lastb - j]) == 0) { min[index(i, j)] = std::min(min[index(i-1,j-1)] + 1, min[index(i,j)]); } } } /*for (int i = 0; i <= lasta; i++) { for (int j = 0; j <= lastb; j++) { printf("%d\t", min[index(i,j)]); } printf("\n"); }*/ tiskni(lasta,lastb); printf(".\n"); } return 0; } void tiskni(int i, int j) { //printf("\ntiskni %d %d\n", i, j); if (min[index(i,j)] == 0) return; if (i == 0) { printf("%s ", b[lastb - j]); tiskni(i, j-1); } else if (j == 0) { printf("%s ", a[lasta - i]); tiskni(i-1,j); } else { char* text = NULL; int i2, j2; if (min[index(i-1,j)] == min[index(i,j)] - 1) { if (text == NULL || strcmp(a[lasta-i], text) < 0) { text = a[lasta-i]; i2 = i-1; j2 = j; } } if (min[index(i,j-1)] == min[index(i,j)] - 1) { if (text == NULL || strcmp(b[lastb-j], text) < 0) { text = b[lastb-j]; i2 = i; j2 = j-1; } } if (min[index(i-1,j-1)] == min[index(i,j)] - 1 && strcmp(a[lasta-i], b[lastb-j])==0) { if (text == NULL || strcmp(a[lasta-i], text) < 0) { text = a[lasta-i]; i2 = i-1; j2 = j-1; } } printf("%s ", text); tiskni(i2,j2); } } int index(int i, int j) { return i + j*(lasta+1); }