#include #include #include /** * Vzorový program pro 28-3-2 Líný písař * Předpokládaný formát vstupu: * na prvním řádku první řetězec * na druhém řádku druhý řetězec * * Program klasickou dynamikou určí nejdelší společnou podposloupnost a následně * s její pomocí určí nejmenší společnou nadposloupnost řetězců. **/ #define MAX_DELKA 1000 int max3(int a, int b, int c) { if (a > b) return (a > c ? a : c); else return (b > c ? b : c); } int main(void) { char *retezec_a, *retezec_b; int **nsp_tabulka; retezec_a = calloc(sizeof(char), MAX_DELKA); retezec_b = calloc(sizeof(char), MAX_DELKA); scanf("%s", retezec_a); scanf("%s", retezec_b); int delka_a = strlen(retezec_a); int delka_b = strlen(retezec_b); nsp_tabulka = calloc(sizeof(int*), delka_a + 1); for (int i=0; i<=delka_a; i++) { nsp_tabulka[i] = calloc(sizeof(int), delka_b + 1); } for (int a=1; a<=delka_a; a++) for (int b=1; b<=delka_b; b++) { nsp_tabulka[a][b] = max3(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) ); } char *nsp = calloc(sizeof(char), nsp_tabulka[delka_a][delka_b] + 1); int a = delka_a; int b = delka_b; int i_nsp = nsp_tabulka[delka_a][delka_b]-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; char *nsn = calloc(sizeof(char), delka_a + delka_b + 1); 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++]; } printf("%s", nsn); free(retezec_a); free(retezec_b); free(nsp); free(nsn); for (int i=0; i<=delka_a; i++) free(nsp_tabulka[i]); free(nsp_tabulka); return 0; }