/* 24-5-2: Dekodér */ #include #include typedef unsigned int uns; // Zpráva a její délka #define MAXK 1024 char msg[MAXK]; uns K; // Přijatý kód a jeho délka #define MAXN 1024 char code[MAXN]; uns N; // Velikost bloku a základ soustavy uns b, z; // Dekódované bloky a jejich počet uns block[MAXN]; uns nb; // Najdeme v kódu nejdelší úsek jedniček uns ones(uns *endpos) { // Nejprve seženeme nějakou nulu uns p = 0; while (code[p]) { p++; if (p >= N) { puts("Samé nuly? Někdo musel nějakou labuť sežrat."); exit(1); } } // Hledáme jedničky uns cnt = 0, max = 0, maxp = 0; for (uns q = (p+1)%N; q != p; q = (q+1)%N) { if (code[q]) { cnt++; if (cnt > max) { max = cnt; maxp = q; } } else cnt = 0; } *endpos = maxp; return max; } // Vynásobíme dvojkové číslo základem z a přičteme další číslici void muladd(uns d) { uns i = 0; while (i < K || d) { d += z * msg[i]; msg[i] = d % 2; d /= 2; i++; } if (i > K) K = i; } int main(void) { // Přečteme kód scanf("%u", &N); for (uns i=0; i= 0; i--) muladd(block[i]); // Vypíšeme výslednou zprávu bez poslední číslice (ta sloužila jako zarážka) for (uns i=0; i