#include #include #include char *obsah; // samotný text, který se postupně snažíme zrekonstruovat int *reference; // reference[p] je buď index políčka, ze kterého se má do p // kopírovat, nebo -1, pokud je p datové /* Rekurzivní funkce, která zjistí znak i-tého políčka */ char zjisti(int i) { // buď znak už známe, nebo je to '!' a zacyklili jsme se (viz níže) if (obsah[i] != '?') return obsah[i]; // vykřičník značí "rozpracováno" obsah[i] = '!'; // rekurzivně se zavoláme a výsledek uložíme pro případná další volání return obsah[i] = zjisti(reference[i]); } int main() { int N, M; // velikost řetězce, počet bloků scanf("%d %d", &N, &M); // alokace paměti obsah = calloc(N + 1, sizeof(*obsah)); // 1 za ukončovací \0 reference = malloc(N * sizeof(*reference)); if (!obsah || !reference) { fprintf(stderr, "Nemohu alokovat paměť.\n"); return 1; } for (int i = 0, pozice = 0; i < M; i++) { /* Pozice bude index prvního políčka aktuálně zpracovávaného bloku. */ char typ; // typ bloku -- data (D), reference (R) int velikost; // velikost bloku scanf(" %c %d", &typ, &velikost); if (typ == 'D') { // datový blok, dostaneme jeho obsah char buffer[N]; scanf("%s", buffer); for (int j = 0; j < velikost; j++) { obsah[pozice + j] = buffer[j]; reference[pozice + j] = -1; } } else { // počáteční adresa kusu pole, ze kterého se budou kopírovat data // do tohoto bloku int adresa; scanf("%d", &adresa); for (int j = 0; j < velikost; j++) { obsah[pozice + j] = '?'; reference[pozice + j] = adresa + j; } } pozice += velikost; } for (int i = 0; i < N; ++i) { if (zjisti(i) == '!') { printf("NEJDE\n"); return 0; } } printf("%s\n", obsah); return 0; }